如何检测 Unity 中的潜在碰撞?

How to detect a potential collision in Unity?

我有一款 Unity 游戏是我的业余爱好,我遇到了一个关于如何最好地处理碰撞检测的有趣问题。我的问题是我的游戏是一款 2D 回合制游戏,游戏对象每次可以在非基于网格的世界中移动固定距离 space。我的游戏对象目前使用 BoxCollider2D 来处理碰撞检测,但我需要能够在实际移动之前确定是否会发生碰撞,这现在会导致游戏对象与另一个游戏对象重叠并触发 OnCollisionEnter2D 事件.这里的最终想法是允许玩家计划移动并在对象旁边显示“导航指南”以显示基于游戏对象移动能力的移动选项。

是否可以使用我的游戏对象的碰撞器,变换其位置以移动或旋转它,查看是否会发生碰撞,但实际上不移动对象本身?

你的意思是像简单地使用 Rigidbody.SweepTest ? ;)

Tests if a rigidbody would collide with anything, if it was moved through the Scene.

来自示例

public class ExampleClass : MonoBehaviour 
{
    public float collisionCheckDistance;
    public bool aboutToCollide;
    public float distanceToCollision;
    public Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        RaycastHit hit;
        if (rb.SweepTest(transform.forward, out hit, collisionCheckDistance))
        {
            aboutToCollide = true;
            distanceToCollision = hit.distance;
        }
    }
}

哦,刚刚注意到,实际上这仅适用于 3D 刚体。

对于 2D 这不存在,但可以使用 Collider2D.Cast

进行复制

Casts the Collider shape into the Scene starting at the Collider position ignoring the Collider itself.