Unity自动寻路入门指南

Unity自动寻路指南

主要参考Naviation这个文档。本文不关注自动寻路的原理,如有需要可以在这里查看nav-InnerWorkings

一些名词

  • Agent:绑定在人物身上的,用于实现自动寻路的,看上去就像一个collision。
  • NavMesh:Agent可以在NavMesh在行走。
  • Off-Mesh Link:相当于传送门。
  • NavMesh Obstacle:障碍物。

所有用于成为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就设置完毕了。



很简单,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的自动寻路。