Unity NavMeshAgent动态设置可行走区域AreaMask

在Navigation视图下的Layers标签页可以设置层,Object标签页可以为物体指定层,Nav Mesh Agent组件的NavMesh Walkable可以指定可行走的层.

 

动态更改可行进层

关于walkableMask:

Built-in Layer 0 对应的 walkableMask 为1

Built-in Layer 1 对应的 walkableMask 为2

Built-in Layer 2 对应的 walkableMask 为4

User Layer 0 对应的 walkableMask 为8

User Layer 1 对应的 walkableMask 为16

如此类推,即是walkableMask为2的(n-1)次方

当设置walkableMask 为-1时,表示所有层都能通过

当设置walkableMask 为0时,表示所有层都不能通过

当设置walkableMask 为1时,表示只有Built-in Layer 0层能通过

当设置walkableMask 为2时,表示只有Built-in Layer 1层能通过

当设置walkableMask 为3时,表示只有Built-in Layer 0和Built-in Layer 1层能通过(3 = 1 + 2)

当设置walkableMask 为8时,表示只有User Layer 0层能通过

代码举例:

void Update()
    {
        OnMouseClick();
    }

    public void OnMouseClick()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                Debug.Log("hit.collider.name:" + hit.collider.name);
                Debug.Log("hit.point:" + hit.point);
                player.GetComponent<NavMeshAgent>().destination = hit.point;
            }
        }
        if (Input.GetKeyDown(KeyCode.A))
        {
            player.GetComponent<NavMeshAgent>().areaMask = 8;
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            player.GetComponent<NavMeshAgent>().areaMask = 16;
        }
        if (Input.GetKeyDown(KeyCode.E))
        {
            player.GetComponent<NavMeshAgent>().areaMask = -1;
        }
    }

小知识点:设置Nav Mesh Agent组件中的Obstacle Avoidance Type为None,即可以让寻路物体互相穿过,也可根据实际需求设置其他的Type

猜你喜欢

转载自blog.csdn.net/Star_MengMeng/article/details/123030520