在Unity中用int32数据类型来表示32个Layer层,int32表示二进制一共有32位(0—31)。在Unity中每个GameObject都有Layer属性,默认的Layer都是Default。在Unity中可编辑的Layer共有24个(8—31层),官方已使用的是0—7层,默认不可编辑!如图:
在代码中使用layers时,先了解
按位运算符:左移运算符<<,左移表示乘以2,左移多少位表示乘以2的几次幂。
在Unity中使用LayerMask时,如何正确开启某个Layer?
LayerMask mask = 1 << 你需要开启的Layers层。
LayerMask mask = 0 << 你需要关闭的Layers层。
左移运算符右端是你希望产生碰撞的层的层号,如上图我想让名为Icon的层和射线产生碰撞,代码里应该这样写:
LayerMaks mask = 1 << 11;
或者:
LayerMaks mask = 1 << (LayerMask.NameToLayer("Icon"));
射线部分的代码:
if (Input.GetTouch(0).phase == TouchPhase.Began)
{
Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
RaycastHit rh = new RaycastHit();
if (Physics.Raycast(ray, out rh, Mathf.Infinity, mask.value))
{
Log.log("碰撞体的名字:" + rh.collider.name);
}
关于LayerMask的其他一些方法:
LayerMask.LayerToName 层转名称:
using UnityEngine;using System.Collections;
public class ExampleClass : MonoBehaviour {
void Example() { Debug.Log(LayerMask.LayerToName(1));
}}
LayerMask.NameToLayer 名称转层:
using UnityEngine;using System.Collections;
public class ExampleClass : MonoBehaviour { void Example() { Debug.Log(LayerMask.NameToLayer("TransparentFX")); }}
LayerMask.value 值:
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
public LayerMask mask = -1;
void Update() {
if (Physics.Raycast(transform.position, transform.forward, 100, mask.value))
Debug.Log("Hit something"); }
}
LayerMask.GetMask 获取蒙版:
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour { void Example() { Debug.Log(LayerMask.GetMask("UserLayerA", "UserLayerB")); }}
Unity中射线默认是碰到碰撞体就停止发射
关于Physics.Raycast射线投射:
Physics.Raycast(ray, out rh, Mathf.Infinity, mask_button.value)
注意第三个参数是距离,
(1)可以是10,100,2000等具体的值
(2)也可以是Mathf.NegativeInfinity负无穷,Mathf.Infinity正无穷等值