我有一个带有单元的板,有些是正常的,有些是墙。我想在两点之间设置一条线,并知道它是否与墙单元碰撞。

这是我的代码:

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 上的某些点根本无法使用。

可以的例子

unity3d - Physics2D.Raycast随机返回null-LMLPHP

在这种情况下还可以,但是如果我在右下角下降了0.2左右,它就无法工作了。

不正常的例子

unity3d - Physics2D.Raycast随机返回null-LMLPHP

我的线穿过绿色,就像根本没有墙一样。

我在墙上的单元格上设置了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/

10-13 07:08