Unity NavMesh 強大的導航功能
分類
說明
本篇簡單介紹 NavMesh 以及利用此工具讓角色智能移動,本篇內容是參考《深入淺出 C# 4/e》 第十章 Unity 實驗室 #5 Raycasting 的內容,當我知道這個工具時,我感受到 Unity 的強大。
預覽
以下是物體移動到滑鼠點擊位置
建立遊戲物件
建立平面
在 Hierarchy 空白處按右鍵 3D Object > Plane
名稱取名為 GameObject Floor。
請將 Transform 設定一致,材質不一致沒關係。
建立遊戲物件
這物件是用來模擬角色移動,使用一個圓柱體當作一個角色,範例中有做一顆頭,那顆頭只是裝飾用這裡會忽略。
在 Hierarchy 空白處按右鍵 3D Object > Cylinder
名稱取名為 Player。
請將 Transform 設定一致。
Nav Mesh Agent 和 Move To Click 後面會告訴你如何加入。
調整主攝影機
請將 Transform 設定一致。
到此你的遊戲畫面應該會很接近預覽畫面了。
Floor 設定 Navigation
打開選單 Windows > AI > Navigation
你應該會在 Inspector 旁邊看到 Navigation 標籤頁
- 在 Navigation 標籤頁選擇 Object
- 在 Hierarchy 選擇 Floor
- 打開 Navigation Static
- Navigation Area 設定 Walkable
這樣 Floor 就是可行走的平面了
烘焙可行走的區域
烘焙的簡單描述就是預先計算可行走的區域,可以節省導航計算時間。
在 Bake 標籤點擊 Bake 按鈕進行烘焙。
當你烘焙完後,一樣顯示著 Navigation 標籤,你就可以在 Scene 看到一層藍色的覆蓋區域,那就是烘焙後可行走的區域。
設定自動導航功能
首先在 Hierarchy 選擇 Player,在 Inspector 按 Add Component 選擇 Navigation > Nav Mesh Agent ,如上圖 Player 的 Inspector
接下來在 Assets 建立 Scripts 資料夾,然後在 Scripts 資料夾新增 MoveToClick.cs
以下是 MoveToClick.cs 程式碼
MoveToClick.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class MoveToClick : MonoBehaviour
{
private NavMeshAgent agent;
void Awake()
{
agent = GetComponent<NavMeshAgent>();
}
// Update is called once per frame
void Update()
{
if (!Input.GetMouseButtonDown(0))
{
return;
}
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100f))
{
agent.SetDestination(hit.point);
}
}
}
在 Awake()
取得 NavMeshAgent
Component,接下來在 Update()
檢查只要滑鼠按下左鍵,就會投射射線檢查有沒有擊中碰撞器,目前場景 Floor 有碰撞器,如果有擊中代表滑鼠點擊到 Floor,就呼叫 agent.SetDestination(hit.point)
移動到滑鼠點擊位置。
詳細射線程式碼的說明可以參考我寫的 Unity 3D 使用射線取得點擊位置資訊
接下來將 Project 的 MoveToClick 腳本拖曳到 Hierarchy 的 Player 遊戲物件上,如上圖 Player 的 Inspector。
最後運行程式,你應該可以如預覽圖那樣移動 Player 物件了。
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!