unity自帶尋路(導(dǎo)航)系統(tǒng) Nav Mesh導(dǎo)航網(wǎng)格
本文為大家分享了unity自帶尋路(導(dǎo)航)系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
一、介紹
unity官方文檔:
導(dǎo)航網(wǎng)格(即 Navigation Mesh,縮寫(xiě)為 NavMesh)是一種數(shù)據(jù)結(jié)構(gòu),用于描述游戲世界的可行走表面,并允許在游戲世界中尋找從一個(gè)可行走位置到另一個(gè)可行走位置的路徑。該數(shù)據(jù)結(jié)構(gòu)是從關(guān)卡幾何體自動(dòng)構(gòu)建或烘焙的。
我們可以這么理解:它是unity官方自帶的一種尋路系統(tǒng)。我們可以通過(guò)它來(lái)制作簡(jiǎn)單的尋路,比如可以制作點(diǎn)擊某個(gè)位置,讓角色自動(dòng)的繞開(kāi)障礙走到目標(biāo)點(diǎn)的效果,比如可以制作敵人AI,讓它可以通過(guò)NavMesh繞開(kāi)障礙追擊我方單位。甚至可以在NavMesh中設(shè)置傳送門,跳躍的起點(diǎn)落點(diǎn),讓這些效果也參與尋路的計(jì)算,成功計(jì)算出導(dǎo)航的捷徑。
二、簡(jiǎn)單使用介紹
簡(jiǎn)單搭一個(gè)場(chǎng)景,創(chuàng)建player和target
//藍(lán)–Player 紅–Target
點(diǎn)擊window–windows–Navigation
在Player身上掛載Nav Mesh Agent組件
導(dǎo)航網(wǎng)格代理 (NavMesh Agent) 組件可幫助您創(chuàng)建在朝目標(biāo)移動(dòng)時(shí)能夠彼此避開(kāi)的角色。代理使用導(dǎo)航網(wǎng)格來(lái)推斷游戲世界,并知道如何避開(kāi)彼此以及移動(dòng)的障礙物。
點(diǎn)擊地面cube,點(diǎn)擊Static旁邊小箭頭,設(shè)置為Navigation Static
點(diǎn)擊Navigation,點(diǎn)擊Bake
可以看到場(chǎng)景中物體可以移動(dòng)的敵方被烘焙成藍(lán)色
如果此處未烘焙成功,首先檢查是否將地面設(shè)置成Static
再看Scene窗口Gizmos設(shè)置,或許是已經(jīng)烘焙成功了但是沒(méi)有顯示
寫(xiě)一個(gè)簡(jiǎn)單的腳本掛載在Player小球身上,告訴它它的目標(biāo)點(diǎn)在哪
獲取到Agent組件,通過(guò)agent.destination設(shè)置目標(biāo)點(diǎn),記得將目標(biāo)點(diǎn)的藍(lán)色方塊拖拽進(jìn)腳本
using UnityEngine; using UnityEngine.AI; public class Player : MonoBehaviour { private NavMeshAgent agent; public Transform target; void Start() { agent = GetComponent<NavMeshAgent>(); agent.destination = target.position; } }
這樣的話就實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的尋路小demo
三、功能詳細(xì)介紹(unity2019.4)
導(dǎo)航網(wǎng)格代理 (NavMesh Agent)
Agent Type 來(lái)自Navigation,可以設(shè)置多個(gè)不同的Type。
==Base offset ==碰撞圓柱體相對(duì)于變換軸心點(diǎn)的偏移。
Steering
Speed 最大移動(dòng)速度(以世界單位/秒表示)。
Angular Speed 最大旋轉(zhuǎn)速度(度/秒)。
Acceleration 最大加速度(以世界單位/平方秒表示)。
Stopping distance 當(dāng)靠近目標(biāo)位置的距離達(dá)到此值時(shí),代理將停止。
Auto Braking 啟用此屬性后,代理在到達(dá)目標(biāo)時(shí)將減速。對(duì)于巡邏等行為(這種情況下,代理應(yīng)在多個(gè)點(diǎn)之間平滑移動(dòng))應(yīng)禁用此屬性
Obstacle Avoidance
Radius 代理的半徑,用于計(jì)算障礙物與其他代理之間的碰撞。
Height 代理通過(guò)頭頂障礙物時(shí)所需的高度間隙。
Quality 障礙躲避質(zhì)量。有五個(gè)選項(xiàng)從None到High Quality,如果擁有大量代理,則可以通過(guò)降低障礙躲避質(zhì)量來(lái)節(jié)省 CPU 時(shí)間。如果將躲避設(shè)置為None,則只會(huì)解析碰撞,而不會(huì)嘗試主動(dòng)躲避其他代理和障礙物。
Priority 執(zhí)行避障時(shí),此代理將忽略優(yōu)先級(jí)較低的代理。該值應(yīng)在 0–99 范圍內(nèi),其中較低的數(shù)字表示較高的優(yōu)先級(jí)。
Path Finding
Auto Traverse OffMesh Link 設(shè)置為 true 可自動(dòng)遍歷網(wǎng)格外鏈接 (Off-Mesh Link)。如果要使用動(dòng)畫(huà)或某種特定方式遍歷網(wǎng)格外鏈接,則應(yīng)關(guān)閉此功能。
Auto Repath 啟用此屬性后,代理將在到達(dá)部分路徑末尾時(shí)嘗試再次尋路。當(dāng)沒(méi)有到達(dá)目標(biāo)的路徑時(shí),將生成一條部分路徑通向與目標(biāo)最近的可達(dá)位置。
Area Mask Area Mask 描述了代理在尋路時(shí)將考慮的區(qū)域類型。在準(zhǔn)備網(wǎng)格進(jìn)行導(dǎo)航網(wǎng)格烘焙時(shí),可設(shè)置每個(gè)網(wǎng)格區(qū)域類型。例如,可將樓梯標(biāo)記為特殊區(qū)域類型,并禁止某些角色類型使用樓梯。(比如,我想讓A可以爬樓梯,B不可以爬,就可以調(diào)整Area Mask做到此效果)
導(dǎo)航網(wǎng)格障礙物 (NavMesh Obstacle)
Shape 可選Capsule或者Box決定障礙的形狀
選Box:
Center 定障礙位置
Size 定障礙大小
選Capsule
Center 定障礙位置
Radius 定障礙半徑
Height 膠囊體的高度
Carve
勾選 Carve 復(fù)選框后,導(dǎo)航網(wǎng)格障礙物會(huì)在導(dǎo)航網(wǎng)格中創(chuàng)建一個(gè)孔。
Move Threshold 當(dāng)導(dǎo)航網(wǎng)格障礙物的移動(dòng)距離超過(guò) Move Threshold 設(shè)置的值時(shí),Unity 會(huì)將其視為移動(dòng)狀態(tài)。使用此屬性可設(shè)置該閾值距離來(lái)更新移動(dòng)的雕孔。
Time To Stationary 將障礙物視為靜止?fàn)顟B(tài)所需等候的時(shí)間(以秒為單位)。
Carve Only Stationary 啟用此屬性后,只有在靜止?fàn)顟B(tài)時(shí)才會(huì)雕刻障礙物
考慮到性能因素和本身導(dǎo)航的局限性,需要多進(jìn)行實(shí)踐來(lái)調(diào)整具體使用的參數(shù)。
網(wǎng)格外鏈接 (Off Mesh Link)
Start 描述網(wǎng)格外鏈接起始位置的對(duì)象。
End 描述網(wǎng)格外鏈接起始位置的對(duì)象。
Cost Override 如果值為正,則在計(jì)算處理路徑請(qǐng)求的路徑成本時(shí)使用該值。否則,使用默認(rèn)成本(此游戲?qū)ο笏鶎賲^(qū)域的成本)。如果 Cost Override 設(shè)置為值 3.0,則在網(wǎng)格外鏈接上移動(dòng)的成本將是在默認(rèn)導(dǎo)航網(wǎng)格區(qū)域上移動(dòng)相同距離的成本的三倍。如果希望讓代理通常優(yōu)先選擇步行,但當(dāng)步行距離明顯更長(zhǎng)時(shí)使用網(wǎng)格外鏈接,則 Cost Override 設(shè)置將變得有用。
Bi-Directional 如果啟用此屬性,則可以在任一方向上遍歷鏈接。否則,只能按照從 Start 到 End 的方向遍歷鏈接。
==Activated ==指定尋路器 (pathfinder) 是否將使用此鏈接(如果將此屬性設(shè)置為 false,則將忽略它)。
Auto Update Positions 如果啟用此屬性,當(dāng)端點(diǎn)移動(dòng)時(shí),網(wǎng)格外鏈接將重新連接到導(dǎo)航網(wǎng)格。如果禁用,即使移動(dòng)了端點(diǎn),鏈接也將保持在其起始位置。
Navigation Area 描述鏈接的導(dǎo)航區(qū)域類型。該區(qū)域類型允許您對(duì)相似區(qū)域類型應(yīng)用常見(jiàn)的遍歷成本,并防止某些角色根據(jù)代理的區(qū)域遮罩 (Area Mask) 訪問(wèn)網(wǎng)格外鏈接。
Bake頁(yè)面
可以設(shè)置Player的導(dǎo)航高度,半徑,可上的樓梯高度,斜坡角度
Generated Off Mesh Links
烘焙的時(shí)候自動(dòng)構(gòu)成,上跳和下躍的網(wǎng)格外鏈接
注意:
掉下鏈接的生成由 Drop Height 參數(shù)控制。該參數(shù)可控制將要連接的最高掉落高度,將值設(shè)置為 0 將禁用生成。
定義掉下鏈接的軌跡時(shí)應(yīng)使水平行程 (A) 為:2agentRadius + 4voxelSize。即,掉落將剛好落在平臺(tái)的邊緣之外。此外,垂直行程 (B) 需要大于烘焙設(shè)置的 Step Height(否則只會(huì)走下平臺(tái))并小于 Drop Height。應(yīng)按體素大小進(jìn)行調(diào)整,確保在體素化期間的任何舍入誤差都不會(huì)阻止生成鏈接。應(yīng)將 Drop Height 的值設(shè)置得比在關(guān)卡中測(cè)量的值略大,使鏈接正確連接。
跳過(guò)鏈接的生成由 Jump Distance 參數(shù)控制。該參數(shù)可控制將要連接的最遠(yuǎn)距離。將值設(shè)置為 0 將禁用生成。
定義跳過(guò)鏈接的軌跡時(shí)應(yīng)使水平行程 © 大于 2*agentRadius 且小于 Jump Distance。此外,著陸位置 (D) 不得超過(guò)距離起始位置關(guān)卡的 voxelSize
Areas頁(yè)
可以創(chuàng)建不同的Areas,設(shè)置不同的Cost,讓角色對(duì)經(jīng)過(guò)某些路線進(jìn)行一個(gè)傾向。比如設(shè)置敵人雖然可以直接穿過(guò)毒氣抓到主角,但是因?yàn)槎練獾腸ost較高,可以讓敵人盡量繞過(guò)毒氣去抓主角,但是如果會(huì)繞的太遠(yuǎn)的話,敵人還是會(huì)選擇穿過(guò)毒氣。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C# 使用WPF 用MediaElement控件實(shí)現(xiàn)視頻循環(huán)播放
在WPF里用MediaElement控件,實(shí)現(xiàn)一個(gè)循環(huán)播放單一視頻的程序,同時(shí)可以控制視頻的播放、暫停、停止。這篇文章給大家介紹了C# 使用WPF 用MediaElement控件實(shí)現(xiàn)視頻循環(huán)播放,需要的朋友參考下吧2018-04-04C#實(shí)現(xiàn)封裝常用Redis工具類的示例代碼
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)封裝常用Redis工具類的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03Quartz.Net實(shí)現(xiàn)原理及使用方法詳解
這篇文章主要介紹了Quartz.Net實(shí)現(xiàn)原理及使用方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12