LayerMask实际上是一个位码操作,在Unity3D中一共有32个Layer层,并且不可增加。
在Unity官方中给出的描述是:
Layers通常被摄像机用来渲染部分场景,和灯光照射部分场景使用。但是它们也可以用来做射线检测时忽略一些collider或Collision使用。
在代码中使用时如何开启某个Layers?
LayerMask mask = 1 << 你需要开启的Layers层。
LayerMask mask = 0 << 你需要关闭的Layers层。
比如:
LayerMask mask = 1 << 2; 表示开启Layer2。
LayerMask mask = 0 << 5;表示关闭Layer5。
LayerMask mask = 1<<2|1<<8;表示开启Layer2和Layer8。
LayerMask mask = 0<<3|0<<7;表示关闭Layer3和Layer7。
上面也可以写成:
LayerMask mask = ~(1<<3|1<<7);表示关闭Layer3和Layer7。
LayerMask mask = 1<<2|0<<4;表示开启Layer2并且同时关闭Layer4.
Unity LayerMask一般用在碰撞射线检测。
+++++++++++++++++++++更新++++++++++++++++++++++++++++
射线碰撞检测相关API:
1、Ray Camera.main.ScreenPointToRay(Vector3 pos)
2、Ray Camera.main.ViewportPointToRay(Vector3 pos)
3、Ray
4、RaycastHit
5、bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)
全部代码:
using UnityEngine;
public class LayerMaskTest : MonoBehaviour
{
private LayerMask mask;
private Camera mainCamera;
private RaycastHit GbjHit;
private Ray myRay;
void Start()
{
mainCamera = Camera.main;
mask = 1 << (LayerMask.NameToLayer("MaskName"));
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
myRay = mainCamera.ScreenPointToRay(Input.mousePosition);
Debug.DrawLine(myRay.origin, GbjHit.point, Color.red, 2);
if (Physics.Raycast(myRay, out GbjHit, 100, mask.value))
{
GameObject Gbj = GbjHit.collider.gameObject;
Debug.Log("HitGameObjectName:" + Gbj.name + "--HitLayoutName:" + LayerMask.LayerToName(10));
}
}
}
}
……