在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