对于上一节中的示例,如果一个游戏场景中包含很多的桥,每个桥都有自己的通行或禁止状态,那么就需要为每一个桥分一个层,这样层数就可能不够用了,因为在Unity中最多只有32层。其次在行进物体很多的时候频繁更改行进物体的可行进层也不是一件轻松的事。Unity提供了另外一种Navmesh Obstacle组件,它更适合处理类似动态路障的问题。将该组件挂载在动态路障上时,行进物体就会在寻路时躲避这些路障。

对比之前的实例,用户不需要手动改变行进物体的可行进层,只需要在桥体上挂载Navmesh Obstacle组件,然后手动改变Navmesh Obstacle组件的enable的值即可,在桥面通行时,enabled为false,桥面不可通行时,enabled为true;

(1) 首先搭建以下的场景

如图所示,平台上有俩座桥我们暂且叫做Bridge1,和Bridge2,Bridge1桥上有一个红色的障碍物obstacle1

(2) 给obstacle1配置如下添加路障组件Nav Mesh Obstacle,并进行如下设置

Nav Mesh Obstacle 组件先不要勾选,目的是让代码脚本更改组件的enabled的值

(3)给路障继续添加代码脚本如下

using UnityEngine;
using System.Collections;

public class BridgeControlNew : MonoBehaviour {

	// Use this for initialization
	void Start () {

        StartCoroutine(Init());
	}
	
	// Update is called once per frame
	void Update () {
	
	}

    IEnumerator Init()
    {
        GetComponent<Renderer>().enabled = false;
        yield return new WaitForSeconds(2f);
        GetComponent<NavMeshObstacle>().enabled = true;
        GetComponent<Renderer>().enabled = true;
    }
}

(4)烘培场景后会发现运动对象,先走近的路线(有障碍的桥),后来障碍生成后发现此路走不通,又会选择另一条桥来走到达目标点。

(5)注意的是,如果一开始就勾选了Nav Mesh Obstacle 组件,则在烘培时,障碍就阻断桥的网格如图,从而一开始就选择没障碍的那条桥走