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