需要检测指定的物体,其它物体都被忽略。
此处我用LayerMask实现的。
Layers通常被摄像机用来渲染部分场景,和灯光照射部分场景使用。但是它们也可以用来做射线检测时忽略一些collder或Collision使用。
如何编辑Layers.
在代码中使用时如何开启某个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。
~(1 << 10) 打开除了第10之外的层。
~(1 << 0) 打开所有的层。
(1 << 10) | (1 << 8) 打开第10和第8的层。
其它方式
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.
使用LayerMask参数
Physics.Raycast(ray, out hitInfo, 500, mask.value)或Physics.Raycast(ray, out hitInfo, 500, mask)
下面为具体实例代码,具体情况具体分析。
//用于检测数据UI界面信息
public LayerMask mask = 1 << (LayerMask.NameToLayer("DataUI"));//实例化mask自定义的层级之上
private Image image;
void Start()
{
//添加layer和BoxCollider
image.gameObject.layer = 15;
image.gameObject.AddComponent<BoxCollider>().size = new Vector3(200, 200, 0);
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
//创建射线;从摄像机发射一条经过鼠标当前位置的射线
RaycastHit hitInfo;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hitInfo, 500, mask.value))
{
GameObject gameObj = hitInfo.collider.gameObject;
Debug.LogError(gameObj);
Debug.LogError(hitInfo.point);
Debug.LogError(hitInfo.collider.transform.localPosition);
}
Debug.DrawLine(ray.origin, hitInfo.point, Color.red, 2);
}
}