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[]结构体。

本文介绍了Unity中LayerMask的原理,通过32位二进制表示32个Layer层,以及如何通过位操作开启或关闭特定层。同时讲解了LayerMask在相机渲染和射线碰撞检测中的应用,重点解析了Physics.Raycast系列API,用于进行光线投射与碰撞检测。参数包括射线起点、方向、距离和选择的LayerMask。还提到了RaycastAll方法,用于获取所有碰撞信息。
554

被折叠的 条评论
为什么被折叠?



