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的自動尋路。