Physics.Raycast重载方法的参数隐式转换引发的血案

我用Raycast检测两个物体是否碰撞,发现无论如何结果都不太对劲,ray貌似忽略了我设置的LayerMask

代码是这样的:

Physics.RaycastAll(start, Vector3.down, 1 << mask);

看出来问题在哪里了么?

尼玛,根本没有Physics.Raycast(Vector3 start, out RaycastHit hit, int layerMask) 这样的重载好不好。。。

我不知道从哪儿得来的一个印象,觉得有这么一个重载,就一直在用。

但是为什么这样调用编译没问题呢,这涉及到了C#参数的隐式转换。

Physics.Raycast恰好有一个重载方法是:

Physics.Raycast(Vector3 start, out RaycastHit hit, float maxDistance)

因为1<<mask是int,隐式转换成float,符合了上面的重载,于是编译是不会出错的。但这样的结果根你期待的设置LayerMask是完全不一样的,你只不过设置了一个maxDistance值等于layermask值的ray

正确的重载应该是:

Physics.Raycast(Vector3 start, out RaycastHit hit, float maxDistance,int layerMask)

原文地址:https://www.cnblogs.com/yaohj/p/4996463.html