Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

【Unity】NavMeshSurfaceでNavMeshを動的にBakeする【NavMesh】

 

内容

NavMeshSurfaceを使い、NavMeshを動的Bakeする方法についてまとめます。

 

開発環境

Unity 2022.3.9f1
AI Navigation ver1.1.4

 

 

パッケージのインストール

Unity Package ManagerからAI Navigationをインストール

 

Unity 2021の場合

Package Managerの左上にある+ボタンから、

「com.unity.ai.navigation」を入力し、Addするとインストールされます。

 

 

SceneにNavMesh Surfaceを作成します。
Sceneビュー右クリックのメニューにAIの項目が増えているのでNavMesh Surfaceを選択

シーン内にNavMeshSurface(がアタッチされたオブジェクト)が作成されました。

 

 

各パラメータを見ていきます
(Unityのバージョンによって微妙に違いがあります)

Agent Type

影響を受けるNavMeshAgentの対象
Humanoidなら、HumanoidのAgentだけがこのエリアを影響を受ける。

Default Type

生成するエリアのタイプ。
歩行可能なエリアだけ作成する、歩行できないエリアだけ作成するといった使い方ができる。

NavMeshLinkの作成の有無。
複数のNavMeshSurfaceを接続する時に使う。

Use Geometry

使用するジオメトリの設定。
Render Meshesなら、レンダリングされるメッシュ(Terrainを含む)に合わせてベイク。
Physics Collidersなら、Collider(IsTriggerでないもの)に合わせてベイク。

Object Collection

ベイク対象のGameObjectを選別する設定

  • All Game Objects:Scene内の全てのオブジェクトが対象
  • Volume:Scene内の指定範囲内のオブジェクトが対象
  • CurrentObjectHierarchy:NavMeshSurfaceの子オブジェクトが対象
  • NavMeshModifierコンポーネントがアタッチされたオブジェクトのみが対象

Include Layers

ベイク対象のレイヤー

 

 

InspectorのBakeボタンを押すとBakeされNavMeshが生成されます。

 

Scriptからは以下のようにBakeできます

using UnityEngine;
using Unity.AI.Navigation;

public class Builder : MonoBehaviour
{
    [SerializeField] private NavMeshSurface surface;
    public void Build()
    {
        surface.BuildNavMesh();
    }
}

 

当然ゲーム実行中にBakeできます。

 

 

まとめ

NavMeshSurfaceを使ってNavMeshを動的にBakeしました。
ランダム生成ダンジョンなど、リアルタイムにNavMeshを更新したい時に役立ちますね。


昔はGitHubからパッケージを落としてこないと使えない機能でしたが、今ならUnityPackageManagerで導入できるので大分使いやすくなりました。

 

以上です。

 

 

おまけ AI Navigation Displayの表示切替

AI NavigationをインストールするとSceneビューにこのようなDisplayが表示されます。

これは右クリックからHideを選ぶと非表示になります。

 

もう一度表示したい時は、Sceneビューの右上端にある3点マークを押してOverlay Menuを選択し、

Overlays Menuが出るので、AI Navigationの目をクリックすると表示されます



 

 

参考資料

 

 

www.matatabi-ux.com