【问题标题】:How to detect a potential collision in Unity?如何检测 Unity 中的潜在碰撞?
【发布时间】:2021-05-17 18:10:45
【问题描述】:
我有一个作为业余爱好的 Unity 游戏,并且遇到了一个有趣的问题,即如何最好地处理碰撞检测。我的问题是我的游戏是一个 2D 回合制游戏,游戏对象每次可以在非基于网格的世界空间中移动固定距离。我的游戏对象当前使用 BoxCollider2D 来处理碰撞检测,但我需要能够确定在实际移动之前是否会发生碰撞,这现在会导致游戏对象与另一个游戏对象重叠并触发 OnCollisionEnter2D 事件.这里的最终想法是允许玩家计划移动并在对象旁边显示“导航指南”,以根据游戏对象的移动能力显示移动选项。
是否可以使用我的游戏对象的对撞机,转换其位置以移动或旋转它,看看是否会发生碰撞,但实际上不移动对象本身?
【问题讨论】:
标签:
unity3d
collision-detection
【解决方案1】:
您的意思是简单地使用 Rigidbody.SweepTest ? ;)
测试刚体是否会与任何物体发生碰撞,如果它被在场景中移动。
来自示例
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 进行复制
从 Collider 位置开始将 Collider 形状投射到场景中,忽略 Collider 本身。