Unity--Physics.OverlapSphere的参数LayerMask和GameObject的layer

Layer介绍:

Unity中是用int32来表示32个Layer层。int32表示二进制一共有32位(0—31)
在Unity中每个GameObject都有Layer属性,默认的Layer都是Default。在Unity中可编辑的Layer共有24个(8—31层),官方已使用的是0—7层,默认不可编辑!LayerMask实际上是一个位掩码,在Unity3D中一共有32个Layer层,并且不可增加。

Unity--Physics.OverlapSphere的参数LayerMask和GameObject的layer_第1张图片

注意事项一:

Physics.OverlapSphere(OverlapSphereCube.position, SearchRadius, 1 << LayerMask.NameToLayer("Team1"));

Physics.OverlapSphere方法以给定的位置为圆心,按照设定距离投射一个球体,返回与投射的球体相交的碰撞器。

第三个参数,传入的是LayerMask,是一个位掩码​​​​​​​,可以用1 << LayerMask.NameToLayer("Team1")或者LayerMask.GetMask("Team1"),这两个语句返回的结果是一致的。

  1. 因此,如果你想让一条光线击中一个id为10的图层上的物体,那么你应该指定的是1 << 10而不是10。
  2. 如果你想让光线击中除了第10层上的内容之外的所有内容,那么只需使用按位补码运算符(〜)来反转位掩码上的每个位。
using UnityEngine;

public class LayerExample1 : MonoBehaviour
{
    public float m_SearchRadius = 5.0f;

    void Start()
    {
        SearchNearUnits();
    }

    public void SearchNearUnits()
    {
        // 1 << LayerMask.NameToLayer("Team1")与LayerMask.GetMask("Team1")的值是一样的
        Collider[] colliders = Physics.OverlapSphere(transform.position, m_SearchRadius, 1 << LayerMask.NameToLayer("Team1"));

        if (colliders.Length <= 0)
        {
            return;
        }
        for (int i = 0; i < colliders.Length; i++)
        {
            print(colliders[i].gameObject.name);
        }
    }
}

注意事项二:

设置GameObject的Layer,需要注意调用LayerMask.NameToLayer("Team2"),设置的Layer数组的索引

下面是GameObject类中对layer属性的描述:

//
// 摘要:
//     The layer the game object is in. A layer is in the range [0...31].
public int layer { get; set; }
using UnityEngine;

public class LayerExample2 : MonoBehaviour
{
    public float m_SearchRadius = 5f;
    public Transform m_Parent;

    private void Start()
    {
        CreateGameObject();
    }

    private void CreateGameObject()
    {
        GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
        GameObject obj1 = GameObject.CreatePrimitive(PrimitiveType.Cube);
        obj1.transform.SetParent(obj.transform);
        SetLayer(obj, LayerMask.NameToLayer("Team2"));
        ResetTransform(obj);
    }

    /// 
    /// 设置对象的Layer
    /// 
    /// 
    /// 
    private void SetLayer(GameObject obj, int layer)
    {
        if (obj == null)
        {
            return;
        }
        obj.layer = layer;
        Transform tr = obj.transform;
        for (int i = 0; i < tr.childCount; i++)
        {
            SetLayer(tr.GetChild(i).gameObject, layer);
        }
    }

    private void ResetTransform(GameObject obj)
    {
        if (obj == null)
        {
            return;
        }
        Transform tr = obj.transform;
        tr.localPosition = Vector3.zero;
        tr.localRotation = Quaternion.identity;
        tr.localScale = Vector3.one;
    }
}

 

你可能感兴趣的:(Unity)