溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)

發(fā)布時(shí)間:2022-03-04 11:39:21 來源:億速云 閱讀:313 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一、介紹

unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)

unity官方文檔:

導(dǎo)航網(wǎng)格(即 Navigation Mesh,縮寫為 NavMesh)是一種數(shù)據(jù)結(jié)構(gòu),用于描述游戲世界的可行走表面,并允許在游戲世界中尋找從一個(gè)可行走位置到另一個(gè)可行走位置的路徑。該數(shù)據(jù)結(jié)構(gòu)是從關(guān)卡幾何體自動(dòng)構(gòu)建或烘焙的。

我們可以這么理解:它是unity官方自帶的一種尋路系統(tǒng)。我們可以通過它來制作簡單的尋路,比如可以制作點(diǎn)擊某個(gè)位置,讓角色自動(dòng)的繞開障礙走到目標(biāo)點(diǎn)的效果,比如可以制作敵人AI,讓它可以通過NavMesh繞開障礙追擊我方單位。甚至可以在NavMesh中設(shè)置傳送門,跳躍的起點(diǎn)落點(diǎn),讓這些效果也參與尋路的計(jì)算,成功計(jì)算出導(dǎo)航的捷徑。

二、簡單使用介紹

簡單搭一個(gè)場景,創(chuàng)建player和target
//藍(lán)–Player 紅–Target

unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)

點(diǎn)擊window–windows–Navigation

在Player身上掛載Nav Mesh Agent組件
導(dǎo)航網(wǎng)格代理 (NavMesh Agent) 組件可幫助您創(chuàng)建在朝目標(biāo)移動(dòng)時(shí)能夠彼此避開的角色。代理使用導(dǎo)航網(wǎng)格來推斷游戲世界,并知道如何避開彼此以及移動(dòng)的障礙物。

unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)

點(diǎn)擊地面cube,點(diǎn)擊Static旁邊小箭頭,設(shè)置為Navigation Static

unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)

點(diǎn)擊Navigation,點(diǎn)擊Bake

unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)

可以看到場景中物體可以移動(dòng)的敵方被烘焙成藍(lán)色

unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)

如果此處未烘焙成功,首先檢查是否將地面設(shè)置成Static
再看Scene窗口Gizmos設(shè)置,或許是已經(jīng)烘焙成功了但是沒有顯示

unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)

寫一個(gè)簡單的腳本掛載在Player小球身上,告訴它它的目標(biāo)點(diǎn)在哪

獲取到Agent組件,通過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è)簡單的尋路小demo

三、功能詳細(xì)介紹(unity2019.4)

導(dǎo)航網(wǎng)格代理 (NavMesh Agent)
unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)

Agent Type 來自Navigation,可以設(shè)置多個(gè)不同的Type。
==Base offset ==碰撞圓柱體相對于變換軸心點(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í)將減速。對于巡邏等行為(這種情況下,代理應(yīng)在多個(gè)點(diǎn)之間平滑移動(dòng))應(yīng)禁用此屬性

Obstacle Avoidance
Radius 代理的半徑,用于計(jì)算障礙物與其他代理之間的碰撞。
Height 代理通過頭頂障礙物時(shí)所需的高度間隙。
Quality 障礙躲避質(zhì)量。有五個(gè)選項(xiàng)從None到High Quality,如果擁有大量代理,則可以通過降低障礙躲避質(zhì)量來節(jié)省 CPU 時(shí)間。如果將躲避設(shè)置為None,則只會(huì)解析碰撞,而不會(huì)嘗試主動(dòng)躲避其他代理和障礙物。
Priority 執(zhí)行避障時(shí),此代理將忽略優(yōu)先級較低的代理。該值應(yīng)在 0–99 范圍內(nèi),其中較低的數(shù)字表示較高的優(yōu)先級。

Path Finding
Auto Traverse OffMesh Link 設(shè)置為 true 可自動(dòng)遍歷網(wǎng)格外鏈接 (Off-Mesh Link)。如果要使用動(dòng)畫或某種特定方式遍歷網(wǎng)格外鏈接,則應(yīng)關(guān)閉此功能。
Auto Repath 啟用此屬性后,代理將在到達(dá)部分路徑末尾時(shí)嘗試再次尋路。當(dāng)沒有到達(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)

unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)

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)距離超過 Move Threshold 設(shè)置的值時(shí),Unity 會(huì)將其視為移動(dòng)狀態(tài)。使用此屬性可設(shè)置該閾值距離來更新移動(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í)踐來調(diào)整具體使用的參數(shù)。

網(wǎng)格外鏈接 (Off Mesh Link)

unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)

unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)

Start 描述網(wǎng)格外鏈接起始位置的對象。
End 描述網(wǎng)格外鏈接起始位置的對象。
Cost Override 如果值為正,則在計(jì)算處理路徑請求的路徑成本時(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)步行距離明顯更長時(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ū)域類型允許您對相似區(qū)域類型應(yīng)用常見的遍歷成本,并防止某些角色根據(jù)代理的區(qū)域遮罩 (Area Mask) 訪問網(wǎng)格外鏈接。

Bake頁面

unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)
可以設(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)卡中測量的值略大,使鏈接正確連接。

跳過鏈接的生成由 Jump Distance 參數(shù)控制。該參數(shù)可控制將要連接的最遠(yuǎn)距離。將值設(shè)置為 0 將禁用生成。
定義跳過鏈接的軌跡時(shí)應(yīng)使水平行程 &copy; 大于 2*agentRadius 且小于 Jump Distance。此外,著陸位置 (D) 不得超過距離起始位置關(guān)卡的 voxelSize

Areas頁

unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)

可以創(chuàng)建不同的Areas,設(shè)置不同的Cost,讓角色對經(jīng)過某些路線進(jìn)行一個(gè)傾向。比如設(shè)置敵人雖然可以直接穿過毒氣抓到主角,但是因?yàn)槎練獾腸ost較高,可以讓敵人盡量繞過毒氣去抓主角,但是如果會(huì)繞的太遠(yuǎn)的話,敵人還是會(huì)選擇穿過毒氣。

以上是“unity如何實(shí)現(xiàn)自帶尋路導(dǎo)航系統(tǒng)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)
AI