五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Unity-導(dǎo)航系統(tǒng)的內(nèi)部工作原理

2021-03-08 08:25 作者:unity_某某師_高錦錦  | 我要投稿

當(dāng)您希望智能地移動游戲中的角色(或者 AI 行業(yè)中所稱的代理)時,必須解決兩個問題:如何_推斷_關(guān)卡來尋找目標(biāo),然后如何_移動_到該位置。這兩個問題是緊密相關(guān)的,但性質(zhì)卻截然不同。關(guān)卡推斷問題更具全局性和靜態(tài)性,因為需要考慮整個場景。移動到目標(biāo)更具局部性和動態(tài)性,只考慮移動的方向以及如何防止與其他移動的代理發(fā)生碰撞。

可行走區(qū)域

導(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)位置映射到各自最近的多邊形。然后,我們從起始位置開始搜索,訪問所有鄰居,直到我們到達目標(biāo)多邊形。通過跟蹤被訪問的多邊形,我們可以找出從起點到目標(biāo)的多邊形序列。一種尋路的常用算法是 A*(發(fā)音為“A star”),這也是 Unity 使用的算法。

跟隨路徑

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

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

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

躲避障礙物

轉(zhuǎn)向邏輯將采用下一個拐角的位置并基于該位置計算出到達目標(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),并可在代理的位置移動時進行局部調(diào)整。局部導(dǎo)航試圖確定如何有效移動到下一個拐角而不與其他代理或移動對象發(fā)生碰撞。

障礙物的兩種情況

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

當(dāng)障礙物為移動狀態(tài)時,最好使用局部障礙躲避功能進行處理。這樣,代理可預(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)的鏈接描述的。有時需要讓代理在不可步行位置進行導(dǎo)航,例如,跳過圍欄或穿過關(guān)閉的門。這些情況需要知道動作的位置。

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

Unity 中的導(dǎo)航系統(tǒng)


Unity-導(dǎo)航系統(tǒng)的內(nèi)部工作原理的評論 (共 條)

分享到微博請遵守國家法律
佛学| 永泰县| 祁连县| 杭锦旗| 台州市| 巴青县| 石屏县| 象州县| 四平市| 隆尧县| 博客| 临夏县| 鲁甸县| 潼南县| 远安县| 宜丰县| 中山市| 宿州市| 武陟县| 林口县| 缙云县| 于都县| 荣昌县| 淳化县| 广昌县| 湘阴县| 扬中市| 吉林市| 皮山县| 隆回县| 武邑县| 尼玛县| 台安县| 纳雍县| 本溪市| 根河市| 襄汾县| 昌邑市| 大同市| 曲阜市| 冀州市|