我有一个简单的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,这意味着每次都会碰到墙壁碰撞器。 "开始"即使在对撞机内也没有点,所以它不会碰到它自己的对撞机。但是我想用这个相同的功能来确定玩家的视线,这样就会有一个碰撞器。
答案 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