Unity NavMesh 強大的導航功能


建立時間: 2022年12月9日 12:42
更新時間: 2023年9月14日 08:43

說明

本篇簡單介紹 NavMesh 以及利用此工具讓角色智能移動,本篇內容是參考《深入淺出 C# 4/e》 第十章 Unity 實驗室 #5 Raycasting 的內容,當我知道這個工具時,我感受到 Unity 的強大。

預覽

以下是物體移動到滑鼠點擊位置

Preview.gif

建立遊戲物件

建立平面

在 Hierarchy 空白處按右鍵 3D Object > Plane

名稱取名為 GameObject Floor。
請將 Transform 設定一致,材質不一致沒關係。

Plane.png

建立遊戲物件

這物件是用來模擬角色移動,使用一個圓柱體當作一個角色,範例中有做一顆頭,那顆頭只是裝飾用這裡會忽略。

在 Hierarchy 空白處按右鍵 3D Object > Cylinder

名稱取名為 Player。
請將 Transform 設定一致。
Nav Mesh Agent 和 Move To Click 後面會告訴你如何加入。

Player.png

調整主攝影機

請將 Transform 設定一致。

Camera.png

到此你的遊戲畫面應該會很接近預覽畫面了。

Floor 設定 Navigation

打開選單 Windows > AI > Navigation

你應該會在 Inspector 旁邊看到 Navigation 標籤頁

  1. 在 Navigation 標籤頁選擇 Object
  2. 在 Hierarchy 選擇 Floor
  3. 打開 Navigation Static
  4. Navigation Area 設定 Walkable

Floor Navigation Setting

這樣 Floor 就是可行走的平面了

烘焙可行走的區域

烘焙的簡單描述就是預先計算可行走的區域,可以節省導航計算時間。

在 Bake 標籤點擊 Bake 按鈕進行烘焙。

Bake

當你烘焙完後,一樣顯示著 Navigation 標籤,你就可以在 Scene 看到一層藍色的覆蓋區域,那就是烘焙後可行走的區域。

Bake 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 物件了。

觀看次數: 2232
ainavigationnavmeshunity導航自動導航
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!