NavMesh简单测试
Unity 3.5 版本并未带来新的图形用户界面(GUI),这着实让我有些失落和郁闷。不过,其内置的寻路系统倒着实给了我不少惊喜。我已将相关测试内容打包,下面是该测试包的信息:
- 测试包名称:TestNavMesh.unitypackage
简要说明
导入与场景设置
导入该包后,按以下步骤操作:
- 打开场景
Game_TestNavMesh。通过Window -> Navigation打开Navigation窗口,此时你能看到舞台上我已经完成烘焙(Bake)的图形。 - 对于场景中的障碍物,需将其设置为
Navigation Static,这样 NavMesh 系统才能正确识别障碍物,规划合理的路径。 - 将脚本附着在
Main Camera上。
脚本代码详解
以下是一段关键脚本的详细说明:
NavMesh.CalculatePath(startPosition.position, endPosition.position, 255, path);
points = path.corners;
iTween.MoveTo(mover, iTween.Hash(
"path", points,
"time", 5,
"orienttopath", false,
"looktime", 0.6,
"easetype", "easeInOutSine",
"loopType", "pingPong"
));
NavMesh.CalculatePath方法:该方法用于计算从startPosition到endPosition的路径。其中,255是代理类型的掩码,这里表示使用所有可用的代理类型。计算结果会存储在path对象中。path.corners:这是一个Vector3数组,它包含了计算得到的路径上的所有拐角点。将其赋值给points变量后,我们就可以使用这些点来控制物体的移动。iTween.MoveTo方法:这是 iTween 插件提供的一个方法,用于让物体mover沿着指定的路径移动。具体参数解释如下:"path":指定移动的路径,即前面计算得到的points数组。"time":表示移动所需的总时间,这里设置为 5 秒。"orienttopath":设置物体是否沿着路径方向旋转,false表示不旋转。"looktime":表示物体在移动过程中转向目标的时间,这里设置为 0.6 秒。"easetype":指定移动的缓动类型,"easeInOutSine"表示使用正弦曲线进行缓动,使移动更加平滑。"loopType":指定循环类型,"pingPong"表示物体在路径两端之间来回移动。
路径优化
对于获取到的 points 数组,我们可以进一步进行优化处理。例如,当 points 数组中任意两个 Vector3 向量之间的距离小于某个特定值时,我们可以删除其中一个点,从而使路径节点更加优化,减少不必要的移动点。
测试代码说明
需要注意的是,void Update () 里的代码是结合 void OnDrawGizmos() 使用的(移动场景中的两个球可以看到效果),这些代码仅用于测试目的。部分读者请勿被此误导,正确的做法是将重新计算路径的操作绑定到某个事件上,例如用户点击、物体碰撞等,这样可以提高性能和用户体验。