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,这意味着每次都会撞到墙壁碰撞器。“起始”点甚至不在对撞机内部,因此它不可能撞击自己的对撞机。但我想使用相同的函数来确定玩家的视线,因此这将涉及对撞机。
你的问题在这一行:
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
归档时间: |
|
查看次数: |
2949 次 |
最近记录: |