在 Unity C# 中将 LayerMasks 与 Physic2D.Linecast() 一起使用

Jam*_*own 1 c# unity-game-engine raycasting

我有一个简单的 DirectPath bool 函数,旨在根据两点之间是否有墙返回 true 或 false。

public bool DirectPath (Vector2 start, Vector2 end) {

    RaycastHit2D hitWall = Physics2D.Linecast (start, end, 8);

    if (hitWall == null) {
        Debug.Log ("Direct path returning true");
        return true;
    } else {
        Debug.Log ("Direct path returning false");
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我已将游戏中所有墙壁碰撞器的图层蒙版设置为“Wall”,它是我的图层列表中的第 8 号。但该函数每次都会返回 false,这意味着每次都会撞到墙壁碰撞器。“起始”点甚至不在对撞机内部,因此它不可能撞击自己的对撞机。但我想使用相同的函数来确定玩家的视线,因此这将涉及对撞机。

cod*_*e11 5

你的问题在这一行:

RaycastHit2D hitWall = Physics2D.Linecast (start, end, 8);
Run Code Online (Sandbox Code Playgroud)

应该是这样的:

RaycastHit2D hitWall = Physics2D.Linecast (start, end, (1<<8));
Run Code Online (Sandbox Code Playgroud)

为什么?因为该参数需要一个图层掩码,即图层的位掩码,而不是索引。

该参数不仅仅需要一层,它提供了根据掩码中位的顺序定义的针对多个层进行投射的选项(除了您设置为 1 的位之外,所有位都将为 0)。这允许您组合蒙版,并执行诸如~(1<<8)对除 8 之外的所有图层进行投射之类的操作。

相关文档:https://docs.unity3d.com/Manual/Layers.html

编辑:

另一个问题是 RaycastHit2D 是一种结构类型。这意味着它永远不为空。

你想检查if (hitWall.collider == null) {

请参阅:http ://answers.unity3d.com/questions/691622/why-does-raycast2d-always-return-non-null.html