我有一个带有单元的板,有些是正常的,有些是墙。我想在两点之间设置一条线,并知道它是否与墙单元碰撞。
这是我的代码:
private void OnDrawGizmosSelected()
{
RaycastHit2D raycast = Physics2D.Raycast(from, to, Vector2.Distance(from, to), layerMask);
if (raycast.collider == null) { Gizmos.color = Color.green; Gizmos.DrawLine(from, to); }
else { Gizmos.color = Color.red; Gizmos.DrawLine(from, to); }
}
它有80%的时间有效。在 map 上的某些点根本无法使用。
可以的例子
在这种情况下还可以,但是如果我在右下角下降了0.2左右,它就无法工作了。
不正常的例子
我的线穿过绿色,就像根本没有墙一样。
我在墙上的单元格上设置了BoxCollider2D和我的图层。
最佳答案
Physics2D.Raycast()中的第二个参数是“方向”,而不是光线的终点(与Gizmos.DrawLine()不同,您可以正确地调用它,因为它确实使用起点和终点作为参数)。您想要这样的东西:
Vector2 direction = to - from;
Physics2D.Raycast(from, direction.normalized, direction.magnitude, layerMask);
在后续的
if
语句中,您还有一些重复的代码可以清除:Gizmos.Color = (raycast.collider == null) ? Color.green : Color.red;
Gizmos.DrawLine(from, to);
关于unity3d - Physics2D.Raycast随机返回null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53642018/