Unity中是用int32来表示32个Layer层。int32表示二进制一共有32位(0—31)。LayerMask实际上是用Int32的32个位来表示每个层级,当这个位为1时表示使用这个层,为0时表示不用这个层。
代码释义:
LayerMask mask = 1 << 你需要开启的Layers层。
LayerMask mask = 0 << 你需要关闭的Layers层。 等价于 LayerMask mask = ~( 1 << 你需要关闭的Layers层。)
public static int OnlyIncluding(params int[] layers) { return MakeMask(layers); } public static int EverythingBut(params int[] layers) { return ~MakeMask(layers); } static int MakeMask(params int[] layers) { int mask = 0; for (int i = 0; i < layers.Length; i++) { mask |= 1 << layers[i]; } return mask; }
layer常用于相机渲染的控制和射线碰撞检测。
相关API:
1、Ray Camera.main.ScreenPointToRay(Vector3 pos) --- 返回一条射线Ray从摄像机到屏幕指定一个点
2、RaycastHit --- 光线投射碰撞信息
3、Ray --- 射线类
4、bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask) --- 当光线投射与任何碰撞器交叉时为真,否则为假。
bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask) --- 在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息()。
bool Physics.Raycast(Ray ray, float distance, int layerMask) --- 当光线投射与任何碰撞器交叉时为真,否则为假。
bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask) --- 当光线投射与任何碰撞器交叉时为真,否则为假。
PS: 如果从一个球型体的内部到外部用光线投射,返回为假。
参数释义:
origin : 在世界坐标中射线的起始点
direction: 射线的方向
distance: 射线的长度
hit: 碰撞信息类。可以得到碰撞物体的transform,rigidbody,point等信息。
layerMask: 只选定Layermask层内的碰撞器,其它层内碰撞器忽略。
<span style="white-space:pre"> </span>if (Input.GetMouseButtonDown (0)) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>GameCamera tempGameCamera = GameCameraManager.GetSingle().getCurrentState() as GameCamera; <span style="white-space:pre"> </span>if(tempGameCamera == null) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>return ; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>Camera tempCurrentCamera = tempGameCamera.pCamera; <span style="white-space:pre"> </span>Ray ray = tempCurrentCamera.ScreenPointToRay(Input.mousePosition); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>RaycastHit hit; <span style="white-space:pre"> </span>Physics.Raycast(ray.origin,ray.direction,out hit); <span style="white-space:pre"> </span>Debug.DrawRay(ray.origin, ray.GetPoint(100000.0f), Color.red); <span style="white-space:pre"> </span>}
5、Ray Camera.main.ViewportPointToRay(Vector3 pos) --- 返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点
6、RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask) --- 投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。