Unity中LayerMask的学习手记

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)