日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

【Unity】Unity寻路系统讲解及Navigation实际应用

發(fā)布時間:2023/12/20 windows 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Unity】Unity寻路系统讲解及Navigation实际应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 常見尋路方式
  • 路點尋路(WayPoint)
  • 單元格尋路(Grid)
  • 導(dǎo)航系統(tǒng)(Navigation)
    • 導(dǎo)航系統(tǒng)核心模塊
    • 工作原理
      • 尋路
      • 跟隨路徑
      • 躲避障礙物
      • 移動代理
      • 全局和局部
      • 障礙物的兩種情況
      • 描述網(wǎng)格外鏈接
  • Navigation實際應(yīng)用
    • 準(zhǔn)備場景
    • 下載 Navigation
    • 添加代理(Nav Mesh Agent)
    • 設(shè)置代理
  • 烘焙路網(wǎng)
    • 創(chuàng)建終點
    • 添加代碼
    • 使用腳本
    • 運行效果
  • 尋路插件


常見尋路方式

Unity常用的尋路方式主要有以下幾種:

  • 路點尋路(WayPoint)
  • 單元格尋路(Grid)
  • 導(dǎo)航系統(tǒng)(Navigation)

路點尋路(WayPoint)

路點尋路就是在地圖上指定一些路點,讓角色在路點之間移動。常用于一些固定路線的敵人或物體。

優(yōu)點:路點尋路的優(yōu)點是實現(xiàn)起來比較簡單,且占用資源少、計算開銷低。路線容易查看和編輯。
缺點:路線完全固定(有時會顯得很僵硬),每個路點都要人為設(shè)定。容易出現(xiàn)繞路、走回頭路和被障礙物卡住的情況。

單元格尋路(Grid)

單元格尋路就是把地圖分隔為多個格子,形成一個矩陣,每個格子標(biāo)注是否可移動,角色在可移動的格子內(nèi)尋路。有點類似于戰(zhàn)棋類游戲的走格子。

優(yōu)點:實現(xiàn)簡單,路線可控,障礙物可控。
缺點:單元格密度大則開銷大,單元格密度小則行動很僵硬。經(jīng)常出現(xiàn)90°轉(zhuǎn)角的情況,需要做平滑處理。不適合做3D游戲。

導(dǎo)航系統(tǒng)(Navigation)

Unity自帶了一套導(dǎo)航系統(tǒng)。導(dǎo)航系統(tǒng)允許使用從場景幾何體自動創(chuàng)建的導(dǎo)航網(wǎng)格來創(chuàng)建可在游戲世界中智能移動的角色。動態(tài)障礙物可讓您在運行時更改角色的導(dǎo)航,而網(wǎng)格外鏈接 (Off-Mesh Link) 可讓您構(gòu)建特定動作,如打開門或從窗臺跳下。本部分將詳細(xì)介紹 Unity 的導(dǎo)航系統(tǒng)和尋路系統(tǒng)。

導(dǎo)航系統(tǒng)核心模塊

  • 導(dǎo)航網(wǎng)格( Navigation Mesh,縮寫為 NavMesh),是一種數(shù)據(jù)結(jié)構(gòu),用于描述游戲世界的可行走表面,并允許在游戲世界中尋找從一個可行走位置到另一個可行走位置的路徑。該數(shù)據(jù)結(jié)構(gòu)是從關(guān)卡幾何體自動構(gòu)建或烘焙的。
  • 導(dǎo)航網(wǎng)格代理 (NavMesh Agent) 組件可幫助您創(chuàng)建在朝目標(biāo)移動時能夠彼此避開的角色。代理使用導(dǎo)航網(wǎng)格來推斷游戲世界,并知道如何避開彼此以及移動的障礙物。
  • 網(wǎng)格外鏈接 (Off-Mesh Link) 組件允許您合并無法使用可行走表面來表示的導(dǎo)航捷徑。例如,跳過溝渠或圍欄,或在通過門之前打開門,全都可以描述為網(wǎng)格外鏈接。
  • 導(dǎo)航網(wǎng)格障礙物 (NavMesh Obstacle) 組件可用于描述代理在世界中導(dǎo)航時應(yīng)避開的移動障礙物。由物理系統(tǒng)控制的木桶或板條箱便是障礙物的典型例子。障礙物正在移動時,代理將盡力避開它,但是障礙物一旦變?yōu)殪o止?fàn)顟B(tài),便會在導(dǎo)航網(wǎng)格中雕刻一個孔,從而使代理能夠改變自己的路徑來繞過它,或者如果靜止的障礙物阻擋了路徑,則代理可尋找其他不同的路線。

工作原理

導(dǎo)航系統(tǒng)需要自己的數(shù)據(jù)來表示游戲場景中的可行走區(qū)域。可行走區(qū)域定義了代理可在場景中站立和移動的位置。在 Unity 中,代理被描述為圓柱體。可行走區(qū)域是通過測試代理可站立的位置從場景中的幾何體自動構(gòu)建的。然后,這些位置連接到場景幾何體之上覆蓋的表面。該表面稱為導(dǎo)航網(wǎng)格(簡稱 NavMesh)。

導(dǎo)航網(wǎng)格將該表面存儲為凸多邊形。凸多邊形是一種有用的表示,因為我們知道多邊形內(nèi)的任意兩點之間沒有障礙物。除了多邊形邊界之外,我們還存儲有關(guān)哪些多邊形彼此相鄰的信息。這使我們能夠推斷整個可行走區(qū)域。

尋路

要尋找場景中兩個位置之間的路徑,我們首先需要將起始位置和目標(biāo)位置映射到各自最近的多邊形。然后,我們從起始位置開始搜索,訪問所有鄰居,直到我們到達(dá)目標(biāo)多邊形。通過跟蹤被訪問的多邊形,我們可以找出從起點到目標(biāo)的多邊形序列。一種尋路的常用算法是 A*(發(fā)音為“A star”),這也是 Unity 使用的算法。

跟隨路徑


描述從起點到目標(biāo)多邊形的路徑的多邊形序列稱為“走廊”(corridor)。代理將始終朝著走廊的下一個可見拐角移動,直至到達(dá)目標(biāo)。如果一個簡單游戲只有一個代理在場景中移動,可一次性找出走廊的所有拐角,并推動角色沿著連接拐角的線段移動。

在多個代理同時移動的情況下,它們需要在避開彼此時偏離原始路徑。試圖使用由線段組成的路徑來糾正這種偏差很快變得非常困難并且容易出錯。


由于每一幀中的代理移動距離非常小,我們可以使用多邊形的連接來修復(fù)走廊,以防我們需要稍微繞道而行。然后,我們快速找到下一個需要抵達(dá)的可見拐角。

躲避障礙物


轉(zhuǎn)向邏輯將采用下一個拐角的位置并基于該位置計算出到達(dá)目標(biāo)所需的方向和速度。使用所需的速度移動代理可能會導(dǎo)致與其他代理發(fā)生碰撞。

障礙躲避系統(tǒng)將選擇新的速度,該速度可平衡“代理在所需方向上移動”和“防止未來與其他代理及導(dǎo)航網(wǎng)格邊緣發(fā)生碰撞”這兩個問題。Unity 采用倒數(shù)速度障礙物 (RVO) 來預(yù)測和防止碰撞。

移動代理

最后在轉(zhuǎn)向和障礙躲避之后計算最終速度。在 Unity 中使用簡單的動態(tài)模型來模擬代理,該模型還考慮了加速度以實現(xiàn)更自然和平滑的移動。

在此階段,您可以將速度從模擬的代理提供給動畫系統(tǒng),從而使用根運動移動角色,或讓導(dǎo)航系統(tǒng)處理該問題。

使用任一方法移動代理后,模擬代理位置將移動并約束到導(dǎo)航網(wǎng)格。最后這一小步對于實現(xiàn)強大的導(dǎo)航功能非常重要。

全局和局部


關(guān)于導(dǎo)航需要了解的最重要事項之一是全局和局部導(dǎo)航之間的區(qū)別。

全局導(dǎo)航用于在整個世界中尋找走廊。在整個世界中尋路是一項代價高昂的操作,需要相當(dāng)多的處理能力和內(nèi)存。

描述路徑的多邊形的線性列表是用于轉(zhuǎn)向的靈活數(shù)據(jù)結(jié)構(gòu),并可在代理的位置移動時進(jìn)行局部調(diào)整。局部導(dǎo)航試圖確定如何有效移動到下一個拐角而不與其他代理或移動對象發(fā)生碰撞。

障礙物的兩種情況

許多導(dǎo)航應(yīng)用需要其他類型的障礙物而不僅僅是其他代理。這些障礙物可能是射擊游戲中的常規(guī)板條箱和木桶,或者是車輛。可使用局部障礙躲避或全局尋路功能來應(yīng)對障礙物。

當(dāng)障礙物為移動狀態(tài)時,最好使用局部障礙躲避功能進(jìn)行處理。這樣,代理可預(yù)測性地避開障礙物。當(dāng)障礙物變?yōu)殪o止?fàn)顟B(tài)并可認(rèn)為其阻擋了所有代理的路徑時,障礙物應(yīng)該影響全局導(dǎo)航,即導(dǎo)航網(wǎng)格。

更改導(dǎo)航網(wǎng)格稱為“雕刻”(carving)。該過程將檢測障礙物的哪些部分會接觸導(dǎo)航網(wǎng)格并在導(dǎo)航網(wǎng)格中雕刻孔洞。此操作的計算成本十分高昂,因此這也是應(yīng)該使用碰撞躲避功能來處理移動障礙物的另一個充分理由。

局部碰撞躲避功能也常用于繞過稀疏分散的障礙物。由于算法是局部的,因此它只考慮即將發(fā)生的碰撞,并且不能繞過陷阱或處理障礙物擋路的情況。這些情況可使用雕刻技術(shù)來解決。

描述網(wǎng)格外鏈接


導(dǎo)航網(wǎng)格多邊形之間的連接是使用尋路系統(tǒng)內(nèi)的鏈接描述的。有時需要讓代理在不可步行位置進(jìn)行導(dǎo)航,例如,跳過圍欄或穿過關(guān)閉的門。這些情況需要知道動作的位置。

可使用網(wǎng)格外鏈接來注釋這些動作;此類鏈接會告訴尋路器 (pathfinder) 存在一條通過指定鏈接的路線。稍后在跟隨路徑時可訪問此鏈接,并可執(zhí)行特殊動作。

前面是照搬手冊中的介紹,下面上點干貨。

Navigation實際應(yīng)用

準(zhǔn)備場景

我們模擬一個塔防游戲,先畫一張簡圖。

然后使用MTE插件創(chuàng)建一張簡易的地圖(暫未完成),截圖如下:

注意:關(guān)于MTE的使用請參考另外一篇文章:【Unity】Unity插件:地形編輯器MTE(Mesh Terrain Editor))

下載 Navigation

因為Unity中的 Navigation 不是自帶的,需要我們到包管理器中去下載。步驟如下:

  • 打開包管理器: Window --> Package Manager;
  • 點擊添加包按鈕;
  • 輸入包名 com.unity.ai.navigation 后點擊 Add 按鈕。
  • 等待一會,Navigation 的包就下載好了。

    添加代理(Nav Mesh Agent)

    我們在場景中建立一個空物體,下面放一個 Cube ,然后給它添加導(dǎo)航代理(Nav Mesh Agent),這個代理讓導(dǎo)航系統(tǒng)能夠幫助我們進(jìn)行角色移動。

    設(shè)置代理

    代理設(shè)置內(nèi)容都很簡單,先根據(jù)角色的大小,通過 Obstacle Avoidance 設(shè)置角色的半徑、高度、質(zhì)量等。然后通過 Steering 設(shè)置角色的移動速度、角速度、加速度等。如下圖:

    烘焙路網(wǎng)

    設(shè)置好代理后我們進(jìn)行路面的烘焙。先打開烘焙窗口: Window --> AI --> Navigation 。

    在 Bake 選項卡中點擊 Bake 按鈕進(jìn)行烘焙。

    烘焙結(jié)果如下:

    創(chuàng)建終點

    在場景中創(chuàng)建一個膠囊模型,更名為 Cristal 。

    添加代碼

    創(chuàng)建一個名為 NavTest 的腳本,具體代碼如下:

    using UnityEngine; using UnityEngine.AI;/// <summary> /// 尋路系統(tǒng) /// </summary> public class NavTest : MonoBehaviour {private NavMeshAgent agent;public Transform target;private void Start(){agent = this.GetComponent<NavMeshAgent>();}private void Update(){if (agent != null){bool flag = agent.SetDestination(target.position);}} }

    使用腳本

    將腳本給到剛才創(chuàng)建的Cube的父對象上,然后將終點的 Cristal 拖拽到腳本的 Target 屬性中。

    運行效果

    先看看固定視角的尋路。

    再看看角色視角的尋路。

    到這里一個簡單的尋路功能就做好了。

    其實除了 Unity 自帶的 Navigation 功能外,還有一些插件可以使用。

    尋路插件

    在Unity Asset Store中也有很多尋路插件可以使用,其原理也大部分與其他三種尋路方式相仿,我們可以自己下載下來試試。

    關(guān)于 Navigation 中代理代理及障礙物的詳細(xì)講解,請參考另一篇文章:【Unity】導(dǎo)航基本組件:Nav Mesh Agent、Off Mesh Link、Nav Mesh Obstacle


    更多內(nèi)容請查看總目錄【Unity】Unity學(xué)習(xí)筆記目錄整理

    總結(jié)

    以上是生活随笔為你收集整理的【Unity】Unity寻路系统讲解及Navigation实际应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。