對 Unity 導航網格 NavMesh 的調研


1. 什么是導航網格 #

NavMesh(導航網格)是 3D 游戲世界中用於實現動態物體自動尋路的一種技術, 將游戲中復雜的結構組織關系簡化為帶有一定信息的網格, 在這些網格的基礎上通過一系列的計算來實現自動尋路. 導航時, 只需要給導航物體掛載導航組件, 導航物體便會自行根據目標點來尋找最直接的路線, 並沿着該線路到達目標點.

自動尋路還可以實現繞過障礙、爬上與跳下障礙物、按類別尋找屬於自己的道路、動態設置道路中的障礙等技術.

2. Navigation 組件各參數含義 #

Object 選項卡, 包括 :

  • Navigation Static 勾選后表示該對象參與導航網格的烘培, 只有選中了 Navigation Static 之后才能進行網格導航;
  • Generate OffMeshLinks 勾選后可跳躍(Jump)導航網格和下落(Drop);
  • Navigation Area 導航網格層(默認是 Walkable)

Bake 選項卡, 烘培參數面板, 包括 :

  • Agent Radius 具有代表性的物體半徑, 半徑越小生成的網格面積越大, 烘焙半徑值越小越好;
  • Agent Height 具有代表性的物體的高度, 角色所要通過的高度;
  • Max Slope 斜坡的坡度, 最大的坡度. 當大於這個坡度時, 會被丟棄;
  • Step Height 台階高度, 低於這個高度, 導航網格地區為連接;
  • Drop Height 允許最大的下落距離, 如果這個屬性的值是正數, 相鄰的導航網格表面高度差低於此值, 將進行網格連接;
  • Jump Distance 跳躍距離, 如果這個屬性的值是正數, 相鄰導航網格表面的水平距離低於此值, 將進行網格連接。;
  • Min Region Area 最小區域面積, 如果低於此臨界值的區域將被丟棄;
  • Width Inaccuracy 允許最大寬度的誤差;
  • Height Inaccuracy 允許最大高度的誤差;
  • Height Mesh 勾選后會保存高度信息,同時會消耗一些性能和存儲空間;

Areas 選項卡 : 里面存放的是各個層的信息, 跟 Object 選項卡里面的 Navigation Area 掛鈎.

3. Nav Mesh Agent 組件各參數含義 #

  • Radius 物體的半徑;
  • Speed 物體的行進最大速度;
  • Acceleration 物體的行進加速度;
  • Angular Speed 行進過程中轉向時的角速度;
  • Stopping Distance 離目標距離還有多遠時停止;
  • Auto Traverse Off Mesh Link 是否采用默認方式度過鏈接路徑;
  • Auto Repath 在行進某些原因中斷后是否重新開始尋路;
  • Height 物體的高度;
  • Base Offset 碰撞模型和實體模型之間的垂直偏移量;
  • Obstacle Avoidance Type 障礙躲避的的表現登記, None 選項為不躲避障礙, 另外等級越高, 躲避效果越好, 同時消耗的性能越多;
  • Avoidance Priority 躲避優先級;
  • NavMesh Walkable 該物體可以行進的網格層掩碼;

4. 示例 #

Step 1 : 搭建場景 Plane Cube1 Cube2 Sphere, 如圖;

Step 2 : 選中物體 Plane Cube1 Cube2, 在 Inspector 面板中選中為靜態(Static)下拉選項的 Navigation Static, 如圖;

Step 3 : Windows ->> Navigation 單擊該面板右下角的 Bake 按鈕, 即可生成導航網格, 下圖為已生成的導航網格;

Step 4 : 為 Sphere 掛一個 Nav Mesh Agent(Component ->> Navigation ->> Nav Mesh Agent);

Step 5 : 為 Sphere 寫一個腳本就可以實現自動尋路, 這樣一個簡單的自動尋路就完成了;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SphereRun : MonoBehaviour {

	public Transform TargetObject = null;

	void Start () {
		if (TargetObject != null) {
			GetComponent<UnityEngine.AI.NavMeshAgent> ().destination = TargetObject.position;
		}
	}

	void Update () {

	}
}

Sphere 加個 NavMeshAgent 和自動尋路的腳本之后效果演示 :

5. 學習資料參考來源 #

http://blog.csdn.net/f786587718/article/details/48897023
http://blog.csdn.net/gary_888/article/details/51438947
http://blog.csdn.net/ynnmnm/article/details/44833007
http://www.cnblogs.com/tonge/p/3931116.html
http://www.cocoachina.com/game/20151201/14519.html

End.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM