NavMesh是Unity自带的一种寻路系统,能够轻松简单地实现AI自动寻路效果。
自动寻路是AI中的一个十分重要的分支,寻路算法一般也是十分复杂的。但Unity为我们提供了十分成熟的NavMesh组件用以简单地解决这一问题,使初学者也能够轻松实现寻路功能。
NavMesh寻路系统的操作步骤大致如下:
- 对场景中的物体进行标记,然后进行路径烘培,产生表格数据。
- 为需要实现寻路功能的物体添加NavMeshAgent组件。
- 通过NavMeshAgent组件的属性与方法实现寻路移动功能。
NavMesh的使用如下图所示:
【1】标记与烘培
若想要让你的游戏场景被NevMesh所“认可”,场景内的相应物体都必须被指定为Navigation Static。我们可以通过Navigation菜单栏中设定其状态,也可以直接在Inspector中把物体设定为Static。
设定完成之后,就可以通过Navigation菜单栏的Bake选项卡来对游戏场景进行烘培。烘培的效果是肉眼可见的,我们可以直接在游戏场景中看到场景的烘培效果,如官方图所示:
其次,在Bake选项卡中还可以设定寻路系统的一些细节,例如:
- Agent Radius:Agent的中心与障碍物的距离。
- Agent Height:Agent可通过的最低高度。
- Max Slope:Agent可爬上的最高坡度。
- Step Height:Agent可上的台阶高度。
【2】添加NavMeshAgent组件
烘培完成之后直接将此组件添加到需要寻路的物体上即可。
NavMeshAgent组件中也有很多参数可以修改,以实现不同的寻路效果。
- Speed:Agent的最高速度。
- Angular Speed:最大的转向速度。
- Acceleration:Agent达到Speed过程中的加速度。
- Stopping Distance:在距离目的地多远的距离停下。
- Auto Braking:在终点是否会自动停下。
- Priority:Agent的权重。
【3】用脚本操作NavMesh
接着实现一个简单的脚本,为Agent设定目的地即可。例如:
1 public class NavMove : MonoBehaviour
2 {
3 public Transform goal;
4 NavMeshAgent agent;
5 void Start()
6 {
7 agent = GetComponent<NavMeshAgent>();
8 }
9 void Update()
10 {
11 agent.destination = goal.position;
12 }
13 }
对于更加复杂的功能以及其实现原理,可以通过Unity3D的官方文档查看。