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层内的碰撞器,其它层内碰撞器忽略。
if (Input.GetMouseButtonDown (0))
{
GameCamera tempGameCamera = GameCameraManager.GetSingle().getCurrentState() as GameCamera;
if(tempGameCamera == null)
{
return ;
}
Camera tempCurrentCamera = tempGameCamera.pCamera;
Ray ray = tempCurrentCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
Physics.Raycast(ray.origin,ray.direction,out hit);
Debug.DrawRay(ray.origin, ray.GetPoint(100000.0f), Color.red);
}
5、Ray Camera.main.ViewportPointToRay(Vector3 pos) --- 返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点
6、RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask) --- 投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。