Unity 3D 導航系統(tǒng)

2020-07-27 16:14 更新

過去,游戲開發(fā)者必須自己打造尋路系統(tǒng),特別是在基于節(jié)點的尋路系統(tǒng)中,必須手動地在 AI 使用的點之間進行導航,因此基于節(jié)點系統(tǒng)的尋路非常煩瑣。

Unity 3D 不僅具有導航功能,還使用了導航網格(navigation meshes),這比手動放置節(jié)點更有效率而且更流暢。

更重要的是,還可以一鍵重新計算整個導航網格,徹底擺脫了手動修改導航節(jié)點的復雜方法。

1) 設置 NavMesh

NavMesh 的設置方法很簡單,在 Hierarchy 視圖中選中場景中除了目標和主角以外的游戲對象,在 Inspector 視圖中單擊 Static 下拉列表,在其中勾選 Navigation Static 即可,如下圖所示。

2) 烘焙

執(zhí)行菜單 Window→Navation 命令,打開導航窗口,單擊右下角的 Bake(烘焙)按鈕即可,烘焙后的場景如下圖所示。 接下來詳細看看 Navigation 面板,它有 Object、Bake、Areas 這 3 個標簽頁。

其中,Object 標簽頁如下圖所示,該標簽頁可以設置游戲對象的參數,如下表所示。當選取游戲對象后,可以在此標簽頁中設置導航相關參數。

參 數 功 能
Navigation Static 勾選后表示該對象參與導航網格的烘焙
Generate OffMeshLinks 勾選后可在導航網格中跳躍(Jump)和下落(Drop)
Navigation Area 導航區(qū)域

Bake 標簽頁如下圖所示,是 Navigation 面板最重要的標簽頁,在該標簽頁下可以設置導航代理相關參數以及烘焙相關參數,參數說明如下表所示。

參 數 功 能
Agent Radius 設置具有代表性的物體半徑,半徑越小,生成的網格面積越大
Agent Height 設置具有代表性的物體的高度
Max Slope 設置斜坡的坡度
Step Height 設置臺階高度
Drop Height 設置允許最大的下落距離
Jump Distance 設置允許最大的跳躍距離
Manual Voxel Size 設置是否手動調整烘焙尺寸
Voxel Size 設置烘焙的單元尺寸,控制烘焙的精度
Min Region Area 設置最小區(qū)域
Height Mesh 設置當地形有落差時是否生成精確而不是近似的烘焙效果

3) 設置導航代理

導航代理(Navigation Agent)可以理解為去尋路的主體。

在導航網格生成之后,給游戲對象添加了一個 Nav Mesh Agent 組件,如下圖所示。

Nav Mesh Agent 面板中各導航代理參數含義如下表所示。

屬性分區(qū) 參 數 功 能
Agent Size Radius 設置導航代理的半徑
Height 設置導航代理的高度
Base Offset 設置圓柱體相對于本地坐標的偏移
Steering Speed 設置最大移動速度
Angular Speed 設置最大角速度
Acceleration 設置最大加速度
Stopping Distance 設置離目標距離還有多遠時停止
Auto Braking 激活時,到達目標位置前將減速
Obstacle Avoidance Quality 設置躲避障礙物的質量,如果設置為0則不躲避其他導航 代理
Priority 設置自身的導航優(yōu)先級,范圍是0?99,值越小,優(yōu)先級 越大
Path Finding Auto Traverse Off Mesh Link 設置是否采用默認方式經過鏈接路徑
Auto Repath 設置當現有的路徑變?yōu)闊o效時是否嘗試獲取一個新的路徑
Area Mask 設置此導航代理可以行走哪些區(qū)域類型

實踐案例:自動尋路

案例構思

使用 Unity 3D 開發(fā)游戲,自動尋路可以有很多種實現方式。A 星尋路是一種比較傳統(tǒng)的人工智能算法,在游戲開發(fā)中比較常用。

另外,Unity 3D 官方內置的尋路插件 Navmesh 也可以實現自動尋路功能。

本案例旨在通過一個簡單的三維場景漫游實現 Navmesh 自動尋路插件的使用。

案例設計

本案例在 Unity 3D 內創(chuàng)建一個簡單的三維場景,場景內有各種障礙,通過 Navmesh 插件可以自動尋找到目標位置。

案例實施

步驟 1):新建三維場景,將其命名為 Navigation。其中,膠囊體作為動態(tài)移動的對象,球體作為導航的目標,如下圖所示。 步驟 2):選中場景中所有除了 sphere、cylinder 攝像機以及直線光以外的所有物體,單擊 Inspector 面板中右上角的 Navigation Static,使這些物體成為靜態(tài)物體,并設置成 Navigation Static 類型,如下圖所示。

步驟 3):執(zhí)行菜單欄中的 Window→Navigation 命令,Navigation 面板如下圖所示。

步驟 4):單擊該面板右下角的 Bake 按鈕,即可生成導航網格,下圖為已生成的導航網格。

步驟 5):下面就可以讓一個膠囊體根據一個導航網格運動到目標 Sphere 位置。執(zhí)行 Component→Navigation→Nav Mesh Agent 為該膠囊體掛載一個 Nav Mesh Agent,如下圖所示。

步驟 6):最后寫一個腳本就可以實現自動尋路了。創(chuàng)建 C# 腳本,將其命名為 DemoNavigation,腳本如下: 純文本復制

using UnityEngine;
using System.Collections;
public class DemoNavigation:MonoBehaviour{
    public Transform target;
    void Start(){
        if(target!=null){
            this.gameObject.GetComponent<NavMeshAgent>().destination=target.position;
        }
    }
}

步驟 7):腳本新建完成后掛載到膠囊體上,然后將 Sphere 賦予膠囊體的 Navigation 腳本,運行場景,如下圖所示,膠囊體會運動到 Sphere 的位置。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號