unity3d OnTriggerEnter2D只在游戏开始时工作,我希望它检查每一帧的碰撞

y3bcpkx1  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(151)

我正在做一个统一的游戏,一种滑动数字拼图,你必须把每一块按升序排列。我的代码检查冲突只在我开始游戏时起作用,所以如果我移动一块,它不会告诉附近的块我移动了附近的块。我希望你理解我的问题,每一个帮助都是感激的。谢谢。这是我的代码看起来与向上检查。我

private void OnTriggerEnter2D(Collider2D collision)
{

    if (collision.gameObject.name == "Piece" || collision.gameObject.name == "Up_Collider")

    {
        piece_Script.Collide_Up = true;
        Debug.LogError("Up");

    }
    else
    {
        piece_Script.Collide_Up = false;
    }
    
}

我原以为else语句能解决这个问题,但它没有。

vptzau2j

vptzau2j1#

确保我下面写的所有东西在你的项目中是正确的:
1-您正在两个对象上使用**“2D”碰撞器。
2-至少有
1个对象具有“Rigidbody 2D”
3-IsTrigger复选框在碰撞器中处于活动状态。
4-您正在使用正确的
标记**。
5-检查-编辑〉项目设置〉Physics 2D中的层冲突矩阵
最好使用tag而不是name

xdyibdwo

xdyibdwo2#

根据你的问题和视频中的代码,我至少看到了一些问题。

**首先,您移动棋子的方式有问题。**您的棋子移动代码是:

Piece.transform.position = Vector3.Lerp(a, b, t);

如果你想触发碰撞事件,这是不正确的。这需要与刚体交互,这意味着你应该用Rigidbody2D.MovePosition()来改变棋子刚体的位置。这将在物理系统中移动你的刚体,这意味着要考虑碰撞/触发。
因此(假设在初始化每个Piece时获得它们的刚体),代码可能如下所示:

// Note also that I used Vector2 here - it's best you keep it consistent
pieceRigidbody.MovePosition(Vector2.Lerp(a, b, t));

第二个,触发输入2D所以我看不出你的“else”条件是特别有用的。要用你当前的代码实现这一点,理论上你可以引入OnTriggerExit2D()来处理“else”条件。但是,你会遇到复杂的情况,因为在移动时,一个棋子在静止前可能会进入和退出另外两个棋子的相同方向的碰撞器。你必须考虑到发生的顺序来得到一个准确的最终状态。

虽然可行,但我有一个替代方法建议:放弃使用触发碰撞器事件,只在点击棋子时检查有效的移动。取消碰撞器事件处理程序,只在点击棋子时在棋子周围的每个位置执行Physics2D.OverlapBox()。如果该位置被另一个棋子或边占据,则不是有效的移动。如果有一个位置没有阻挡,则将棋子移动到那里。

相关问题