C語言中文網 目錄

Unity 3D導航系統(Navigation)

< 上一頁Unity 3D導航系統 Unity 3D障礙物下一頁 >

Unity 3D Navigation(導航)是用于實現動態物體自動尋路的一種技術,它將游戲場景中復雜的結構關系簡化為帶有一定信息的網格,并在這些網格的基礎上通過一系列相應的計算來實現自動尋路。

本節主要講解在創建好的三維場景中烘焙導航網格、創建導航代理以實現讓角色繞過重重障礙最終到達終點的功能。

導航系統

過去,游戲開發者必須自己打造尋路系統,特別是在基于節點的尋路系統中,必須手動地在 AI 使用的點之間進行導航,因此基于節點系統的尋路非常煩瑣。

Unity 3D 不僅具有導航功能,還使用了導航網格(navigation meshes),這比手動放置節點更有效率而且更流暢。

更重要的是,還可以一鍵重新計算整個導航網格,徹底擺脫了手動修改導航節點的復雜方法。

1) 設置 NavMesh

NavMesh 的設置方法很簡單,在 Hierarchy 視圖中選中場景中除了目標和主角以外的游戲對象,在 Inspector 視圖中單擊 Static 下拉列表,在其中勾選 Navigation Static 即可,如下圖所示。

設置NavMesh

2) 烘焙

執行菜單 Window→Navation 命令,打開導航窗口,單擊右下角的 Bake(烘焙)按鈕即可,烘焙后的場景如下圖所示。

場景烘焙后的效果

接下來詳細看看 Navigation 面板,它有 Object、Bake、Areas 這 3 個標簽頁。

其中,Object 標簽頁如下圖所示,該標簽頁可以設置游戲對象的參數,如下表所示。當選取游戲對象后,可以在此標簽頁中設置導航相關參數。

Navigation面板
 
參 數 功 能
Navigation Static 勾選后表示該對象參與導航網格的烘焙
Generate OffMeshLinks 勾選后可在導航網格中跳躍(Jump)和下落(Drop)
Navigation Area 導航區域

Bake 標簽頁如下圖所示,是 Navigation 面板最重要的標簽頁,在該標簽頁下可以設置導航代理相關參數以及烘焙相關參數,參數說明如下表所示。

bake標簽頁

參 數 功 能
Agent Radius 設置具有代表性的物體半徑,半徑越小,生成的網格面積越大
Agent Height 設置具有代表性的物體的高度
Max Slope 設置斜坡的坡度
Step Height 設置臺階高度
Drop Height 設置允許最大的下落距離
Jump Distance 設置允許最大的跳躍距離
Manual Voxel Size 設置是否手動調整烘焙尺寸
Voxel Size 設置烘焙的單元尺寸,控制烘焙的精度
Min Region Area 設置最小區域
Height Mesh 設置當地形有落差時是否生成精確而不是近似的烘焙效果

3) 設置導航代理

導航代理(Navigation Agent)可以理解為去尋路的主體。

在導航網格生成之后,給游戲對象添加了一個 Nav Mesh Agent 組件,如下圖所示。

Nav Mesh Agent 面板中各導航代理參數含義如下表所示。

Nav Mesh Agent組件

屬性分區 參 數 功 能
Agent Size Radius 設置導航代理的半徑
Height 設置導航代理的高度
Base Offset 設置圓柱體相對于本地坐標的偏移
Steering Speed 設置最大移動速度
Angular Speed 設置最大角速度
Acceleration 設置最大加速度
Stopping Distance 設置離目標距離還有多遠時停止
Auto Braking 激活時,到達目標位置前將減速
Obstacle
Avoidance
Quality 設置躲避障礙物的質量,如果設置為0則不躲避其他導航 代理
Priority 設置自身的導航優先級,范圍是0?99,值越小,優先級 越大
Path Finding Auto Traverse Off Mesh Link 設置是否采用默認方式經過鏈接路徑
Auto Repath 設置當現有的路徑變為無效時是否嘗試獲取一個新的路徑
Area Mask 設置此導航代理可以行走哪些區域類型

實踐案例:自動尋路

案例構思

使用 Unity 3D 開發游戲,自動尋路可以有很多種實現方式。A 星尋路是一種比較傳統的人工智能算法,在游戲開發中比較常用。

另外,Unity 3D 官方內置的尋路插件 Navmesh 也可以實現自動尋路功能。

本案例旨在通過一個簡單的三維場景漫游實現 Navmesh 自動尋路插件的使用。

案例設計

本案例在 Unity 3D 內創建一個簡單的三維場景,場景內有各種障礙,通過 Navmesh 插件可以自動尋找到目標位置。

案例實施

步驟 1):新建三維場景,將其命名為 Navigation。其中,膠囊體作為動態移動的對象,球體作為導航的目標,如下圖所示。

三維場景搭建效果

步驟 2):選中場景中所有除了 sphere、cylinder 攝像機以及直線光以外的所有物體,單擊 Inspector 面板中右上角的 Navigation Static,使這些物體成為靜態物體,并設置成 Navigation Static 類型,如下圖所示。

添加navmesh

步驟 3):執行菜單欄中的 Window→Navigation 命令,Navigation 面板如下圖所示。

Navigation面板

步驟 4):單擊該面板右下角的 Bake 按鈕,即可生成導航網格,下圖為已生成的導航網格。

烘焙后的效果

步驟 5):下面就可以讓一個膠囊體根據一個導航網格運動到目標 Sphere 位置。執行 Component→Navigation→Nav Mesh Agent 為該膠囊體掛載一個 Nav Mesh Agent,如下圖所示。

掛載Nav Mesh Agent

步驟 6):最后寫一個腳本就可以實現自動尋路了。創建 C# 腳本,將其命名為 DemoNavigation,腳本如下:
using UnityEngine;
using System.Collections;
public class DemoNavigation:MonoBehaviour{
    public Transform target;
    void Start(){
        if(target!=null){
            this.gameObject.GetComponent<NavMeshAgent>().destination=target.position;
        }
    }
}
步驟 7):腳本新建完成后掛載到膠囊體上,然后將 Sphere 賦予膠囊體的 Navigation 腳本,運行場景,如下圖所示,膠囊體會運動到 Sphere 的位置。

運動測試前

膠囊體開始向球體運動
< 上一頁Unity 3D導航系統 Unity 3D障礙物下一頁 >

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo