在Unity C中使用带有Physic2D.Linecast()的layerMasks#

时间:2016-12-13 17:17:18

标签: c# unity3d raycasting

我有一个简单的DirectPath bool函数,它根据2点之间是否存在墙来返回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;
    }
}

我已经为游戏中的所有墙壁碰撞器设置了layerMask到#34; Wall"这是我的图层列表中的数字8。但是这个函数每次都返回false,这意味着每次都会碰到墙壁碰撞器。 "开始"即使在对撞机内也没有点,所以它不会碰到它自己的对撞机。但是我想用这个相同的功能来确定玩家的视线,这样就会有一个碰撞器。

1 个答案:

答案 0 :(得分:4)

你的问题就在这一行:

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

应该如下:

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

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

该参数并不仅仅需要一个图层,它提供了根据掩码中的位顺序定义的多个图层的选项(除了您创建的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