W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
過(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ù)雜方法。
NavMesh 的設(shè)置方法很簡(jiǎn)單,在 Hierarchy 視圖中選中場(chǎng)景中除了目標(biāo)和主角以外的游戲?qū)ο螅?Inspector 視圖中單擊 Static 下拉列表,在其中勾選 Navigation Static 即可,如下圖所示。
執(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í)是否生成精確而不是近似的烘焙效果 |
導(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ū)域類型 |
使用 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)尋路插件的使用。
本案例在 Unity 3D 內(nèi)創(chuàng)建一個(gè)簡(jiǎn)單的三維場(chǎng)景,場(chǎng)景內(nèi)有各種障礙,通過(guò) Navmesh 插件可以自動(dòng)尋找到目標(biāo)位置。
步驟 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 的位置。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: