Unity自动寻路指南
主要参考Naviation这个文档。本文不关注自动寻路的原理,如有需要可以在这里查看nav-InnerWorkings
一些名词
Agent
:绑定在人物身上的,用于实现自动寻路的,看上去就像一个collision。NavMesh
:Agent可以在NavMesh在行走。Off-Mesh Link
:相当于传送门。NavMesh Obstacle
:障碍物。
创建NavMesh
标记为Navigation Static
所有用于成为NavMesh的网格都必须被指定为Navigation Static
。
方法如下,选中GameObject,然后在菜单栏的[Window]-[Navigation]-[Object]-勾选即可。
烘培Bake
点击Bake开始烘培,其中的属性说明如下,可以参照这个图
Agent Radius
:Agent的中心可以离障碍物有多近。Agent Height
:Agent可以通过的最矮高度。Max Slope
:Agent可以爬上的最高坡度。Step Height
:Agent每次可以上的最高高度(相当于一节楼梯的高度)。
一般来说,到这里设置完就可以点击Bake了,如果需要高级设置(设置体元和一些孤立的表面),参考这里nav-AdvancedSettings。
bake成功以后,选择的mesh表面就会像上面一样变成蓝色。
到这里NavMesh就设置完毕了。
NavMesh Agent设置和脚本编写
很简单,Agent Size
设置可以在Scene面板中实时看到。
Speed
:Agent所能达到的最大速度。Angular Speed
:最大的转向速度,不是人物的转向,是Agent需要拐弯的时候的最大的转向速度,如果这个过低,将会产生螺旋线路效果。Acceleration
:Agent到达Speed过程中的加速度,越大越快抵达Speed。Stopping Distance
:距离目的地多少远的距离停下。Auto Braking
:在终点是否自动停下,如果不勾选这个,Agent将会在终点绕终点做谐振。Priority
:多个Agents同时存在时,权重高的将会被忽略,权重取值范围从0到99,0是最重要,默认为50。Auto Traverse OffMeshLink
:到达Off-Mesh Link
的位置是否自动触发传送。
设置完以上步骤后,只需以下代码,Agent就会移动到指定位置。
// MoveTo.cs
using UnityEngine;
using System.Collections;
public class MoveTo : MonoBehaviour {
public Transform goal;
void Start () {
NavMeshAgent agent = GetComponent<NavMeshAgent>();
agent.destination = goal.position;
}
}
结合人物动画
官方的nav-CreateNavMeshAgent这个DEMO很简单,主要就是通过agent完成寻路,同时控制AnimationController。
关于更完美的例子可以查看StandardAsset Example
中的CharacterThirdPersonAI
,结合了第三人称人物动画控制器ThirdPersonAnimationController
和第三人称人物控制器ThirdCharacterController
完成了带walk和run的自动寻路。