c# - 使用图层蒙版进行光线投射
问题描述
我最近开始在 Unity 中为我正在制作的游戏学习 RayCast,但是在尝试使用图层蒙版过滤我的 2 Dimensional RayCast 时遇到了问题。
我正在尝试使用光线投射来确定光线路径中是否存在墙壁对象(基本上是带有盒子碰撞器的 2D 方形预制件)。
我已将所有墙壁对象放置在用户层 8(称为“墙壁”)上,并希望使用仅允许光线与墙壁图层上的对象接触的图层蒙版,以避免光线与任何其他对象发生碰撞.
我正在使用的 RayCast 从不在 Walls 层上的另一个对象开始;如果没有 LayerMask,光线将立即与该对象接触,并返回该对象。
这是我尝试将 RayCast 与 LayerMask 过滤器一起使用的代码
print("testing for collisions");
relitivePos = new Vector2(turns[k+1].x-turns[k].x,turns[k+1].y-turns[k].y);
relitivePos = new Vector2(Mathf.Round(relitivePos.x), Mathf.Round(relitivePos.y));
int layerMask = (1 << 8);
//layerMask = ~layerMask;
RaycastHit2D hitInfo = Physics2D.Raycast(turns[k], relitivePos, (relitivePos.y.Equals(1) ? turns[k + 1].y - turns[k].y : turns[k + 1].x - turns[k].x), layerMask);
UnityEngine.Debug.DrawLine(turns[k], turns[k + 1], Color.blue, 100f);
print("hit? " + (hitInfo.collider != null? "true":"false"));
if (hitInfo.collider != null)
{
print("gameobject" + hitInfo.collider.gameObject);
print("collider name " + hitInfo.collider.name);
}
我尝试通过层号对 int 进行位移以创建 LayerMask,以及使用LayerMask.GetMask("Walls");
在这两种情况下,RayCast 似乎都没有击中任何东西(prints: "hit? false"
)。删除 LayerMask 时,它将打印 LayerMask 最初以 ( prints:"collider name door"
) 开头的对象。
我不明白为什么我的 RayCast 在使用 LayerMask 时没有检测到特定图层上的对象?
更新:
- 从那以后,我尝试制作一个'public LayerMask wallLayerMask;',并通过统一接口提供 Walls 层,但这似乎与仅使用 'LayerMask.GetMask("Walls");' 没有任何不同的结果。
- 脱离 Drako18s 所说,我认为 '1<<8' 是创建图层蒙版的正确方法(而不是 'LayerMask.GetMask("Walls");'。如果我理解正确,理论上我可以do '1 << LayerMask.GetMask("Walls");' 这与 '1 << 8' 相同
最小的可重现示例
int layerMask = 1<<8; RaycastHit2D hitInfo = Physics2D.Raycast(Vector2.zero, Vector2.up, 10, layerMask); print("命中?" + (hitInfo.collider != null?"true":"false")); if (hitInfo.collider != null) { print("gameobject" + hitInfo.collider.gameObject); print("对撞机名称" + hitInfo.collider.name); }
解决方案
推荐阅读
- c# - 在使用来自外部提供者的 ASP.NET 身份和 JWT 身份验证时,我可以使用角色和声明的授权属性过滤吗?
- c++ - 使用继承时避免重复相同的代码
- php - 如何在 php7.2 和 ubuntu 14 上添加 curl
- reactjs - React 组件是一个函数而不是一个类
- java - scheduleAtFixedRate 与定时器
- javascript - 如何获取与数组中对象关联的所有值?
- php - 提交表单后,我没有在数组中获得多个值
- ios - 如何修复 Xcode Swift 游戏中出现在屏幕上的随机矩形精灵
- asp.net-web-api - 使用 asp.net web api 连接到 Ldap 并验证用户
- sql-server - 如何从临时表名中选择,传递给存储过程?