目录
Raycast函数有很多重载(函数的重载根据函数的参数来决定)
这里只涉及这个重载,其余重载可以很方便得在Visual Studio中看源码获取;
public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask)
{
return defaultPhysicsScene.Raycast(origin, direction, out hitInfo, maxDistance, layerMask);
}
关于第四个参数:int layerMask;
一开始时,我认为这里的int 就是在Inspector里图层的索引;
如下图,被红色圈起来的就是图层的索引:
我实现的这个射线检测无论怎样都无法检测出Player图层;
Physics.Raycast(CharacterCamera.transform.position, transform.TransformDirection(Vector3.forward),out hitInfo, maxShootDistance, 6);
? 其实这里第四个参数其实对应的是2^(索引);
如果要获得Player图层的话,第四个参数应该填上2的6次方,也就是64才对;
使用LayerMask.GetMask("Player")代替64也是同样的效果,因为它的返回值就是64;
Physics.Raycast(CharacterCamera.transform.position, transform.TransformDirection(Vector3.forward),out hitInfo, maxShootDistance, LayerMask.GetMask("Player"));
如果要检测多个图层的话,直接用LayerMask.GetMask("图层名1",“图层名2”,“图层名3”....);
返回值是各个图层对应的LayerMask.GetMask的返回值相加得到的和;
LayerMask.GetMask("图层名1",“图层名2”,“图层名3”)
等价于
LayerMask.GetMask("图层名1")+LayerMask.GetMask(“图层名2”)+LayerMask.GetMask(“图层名3”);
因为unity的图层使用int32来表示的,也就是2的32次方,公有32个图层(0~31),如图
图层相加的值能被唯一分解;
假设图层和是65的话,那么能确定图层分别是图层0和图层6,就是(2^0+2^6);
另外,可以用LayerMask.NameToLayer("图层名")获取图层的索引;
例如:
LayerMask.NameToLayer("Player") 等于 6;
所以上面的代码可以替换:
1.位运算,右移
LayerMask.GetMask("Player")?
等价于
1<<LayerMask.NameToLayer("Player")
2.右移位运算和按位或(图层都有32位,每个图层都只有一位为1,其余都为0,在这个条件下,按位或运算等于加法)
LayerMask.GetMask("图层名1",“图层名2”)
等价于?
1<<LayerMask.NameToLayer("图层1")|1<<LayerMask.NameToLayer("图层2")