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

2020-07-27 16:14 更新

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

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

更重要的是,還可以一鍵重新計(jì)算整個(gè)導(dǎo)航網(wǎng)格,徹底擺脫了手動(dòng)修改導(dǎo)航節(jié)點(diǎn)的復(fù)雜方法。

1) 設(shè)置 NavMesh

NavMesh 的設(shè)置方法很簡(jiǎn)單,在 Hierarchy 視圖中選中場(chǎng)景中除了目標(biāo)和主角以外的游戲?qū)ο螅?Inspector 視圖中單擊 Static 下拉列表,在其中勾選 Navigation Static 即可,如下圖所示。

2) 烘焙

執(zhí)行菜單 Window→Navation 命令,打開(kāi)導(dǎo)航窗口,單擊右下角的 Bake(烘焙)按鈕即可,烘焙后的場(chǎng)景如下圖所示。 接下來(lái)詳細(xì)看看 Navigation 面板,它有 Object、Bake、Areas 這 3 個(gè)標(biāo)簽頁(yè)。

其中,Object 標(biāo)簽頁(yè)如下圖所示,該標(biāo)簽頁(yè)可以設(shè)置游戲?qū)ο蟮膮?shù),如下表所示。當(dāng)選取游戲?qū)ο蠛?,可以在此?biāo)簽頁(yè)中設(shè)置導(dǎo)航相關(guān)參數(shù)。

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

Bake 標(biāo)簽頁(yè)如下圖所示,是 Navigation 面板最重要的標(biāo)簽頁(yè),在該標(biāo)簽頁(yè)下可以設(shè)置導(dǎo)航代理相關(guān)參數(shù)以及烘焙相關(guān)參數(shù),參數(shù)說(shuō)明如下表所示。

參 數(shù) 功 能
Agent Radius 設(shè)置具有代表性的物體半徑,半徑越小,生成的網(wǎng)格面積越大
Agent Height 設(shè)置具有代表性的物體的高度
Max Slope 設(shè)置斜坡的坡度
Step Height 設(shè)置臺(tái)階高度
Drop Height 設(shè)置允許最大的下落距離
Jump Distance 設(shè)置允許最大的跳躍距離
Manual Voxel Size 設(shè)置是否手動(dòng)調(diào)整烘焙尺寸
Voxel Size 設(shè)置烘焙的單元尺寸,控制烘焙的精度
Min Region Area 設(shè)置最小區(qū)域
Height Mesh 設(shè)置當(dāng)?shù)匦斡新洳顣r(shí)是否生成精確而不是近似的烘焙效果

3) 設(shè)置導(dǎo)航代理

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

在導(dǎo)航網(wǎng)格生成之后,給游戲?qū)ο筇砑恿艘粋€(gè) Nav Mesh Agent 組件,如下圖所示。

Nav Mesh Agent 面板中各導(dǎo)航代理參數(shù)含義如下表所示。

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

實(shí)踐案例:自動(dòng)尋路

案例構(gòu)思

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

另外,Unity 3D 官方內(nèi)置的尋路插件 Navmesh 也可以實(shí)現(xiàn)自動(dòng)尋路功能。

本案例旨在通過(guò)一個(gè)簡(jiǎn)單的三維場(chǎng)景漫游實(shí)現(xiàn) Navmesh 自動(dòng)尋路插件的使用。

案例設(shè)計(jì)

本案例在 Unity 3D 內(nèi)創(chuàng)建一個(gè)簡(jiǎn)單的三維場(chǎng)景,場(chǎng)景內(nèi)有各種障礙,通過(guò) Navmesh 插件可以自動(dòng)尋找到目標(biāo)位置。

案例實(shí)施

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

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

步驟 4):?jiǎn)螕粼撁姘逵蚁陆堑?Bake 按鈕,即可生成導(dǎo)航網(wǎng)格,下圖為已生成的導(dǎo)航網(wǎng)格。

步驟 5):下面就可以讓一個(gè)膠囊體根據(jù)一個(gè)導(dǎo)航網(wǎng)格運(yùn)動(dòng)到目標(biāo) Sphere 位置。執(zhí)行 Component→Navigation→Nav Mesh Agent 為該膠囊體掛載一個(gè) Nav Mesh Agent,如下圖所示。

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

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 腳本,運(yùn)行場(chǎng)景,如下圖所示,膠囊體會(huì)運(yùn)動(dòng)到 Sphere 的位置。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)