【Unity】NavMeshがベイクできない・表示されない時の対処|Unity 6版

Bakeボタンを押したのに、床に青い範囲が出ない。あるいは一部だけ欠けている。NavMeshでつまずく人の多くは、だいたいこの場面で手が止まります。この記事では、Unity 6のNavMesh Surfaceでベイクできない・表示されない時の原因を7つ、確かめる順番に並べて、それぞれの直し方を書きます。

先に結論を言うと、原因の半分以上は「そもそもNavMeshはできているのに見えていないだけ」か「ベイクの材料になる物の指定がずれている」のどちらかです。この記事の内容は、AI Navigationパッケージ2.0.12のドキュメントとソースコード、Unity 6000.3.14f1で確認しています。

・NavMesh SurfaceのBakeを押しても、シーンに青い範囲が表示されない
・床の一部や2階だけ、NavMeshが作られない
・昔の記事にある「Navigation Static」や「Bakeタブ」が見つからない
・エディタでは動くのに、ゲームを実行するとNavMeshがない

今週のこのブログは敵AIを続けて取り上げています。敵AIそのものの作り方は、こちらの記事で巡回・追跡・攻撃まで通して書いています。

スポンサーリンク

NavMeshがベイクできない時に最初に確かめること

いきなり設定を触る前に、「本当にベイクできていないのか」を確かめるのが近道です。見分け方は、NavMesh SurfaceのインスペクターにあるNavMesh Dataの欄。

ここが「None」ならNavMeshはまだ作られていません。逆に、アセット名(オブジェクト名と同じ名前)が入っていれば、ベイク自体は終わっています。表示の設定で見えていないだけなので、次の章から読んでください。

もう1つ、欄が「Missing」になっていることがあります。公式ドキュメントによると、Projectウィンドウでアセットファイルを消した時にこの表示になるそうです。この場合は、NavMesh SurfaceのClearを押してからBakeを押し直せば元に戻ります。

NavMesh Dataの表示 状態 見る章
None ベイクされていない 原因2〜6
アセット名が入っている ベイク済み・見えていないだけの可能性 原因1
Missing アセットファイルが消えている Clear→Bake

原因1:NavMeshが表示されないのはオーバーレイが閉じているから

Unity 6でいちばん多いのが、これだと思います。NavMeshの表示はシーンビューの「AI Navigation」オーバーレイで切り替える仕組みになっていて、このオーバーレイはAI Navigation 2.0のソースで既定が非表示(defaultDisplay = false)です。

表示させる手順はこうです。

  1. シーンビューの上で「`」キーを押すか、シーンビュー右上の︙からOverlay Menuを開く
  2. 一覧の「AI Navigation」にチェックを入れる
  3. シーンビューの右下に出たパネルで、Surfacesの「Show NavMesh」にチェックが入っているか見る

同じパネルの「Show Only Selected」にも注意してください。これがオンだと、選んでいるオブジェクトの階層にあるNavMesh Surfaceしか表示されません。床とは別のオブジェクトを選んだ瞬間に青い範囲が消えるのは、たいていこれです。

NavMeshは見えていなくても、敵はちゃんと歩けます。表示されないだけで設定を何度もいじってしまうと、本当の原因が分からなくなりがちなので、まずここを確かめるのがおすすめです。

原因2:Use Geometryの設定と床の作り方が合っていない

NavMesh Surfaceは、シーンの何を材料にしてNavMeshを作るかを「Use Geometry」で決めています。ソースの初期値はRender Meshes。つまり、見た目のメッシュ(Mesh Renderer)とTerrainが材料です。

ここで困るのが、見た目を持たない床です。透明な当たり判定だけの床や、Mesh Rendererをオフにした床は、Render Meshesでは材料に入りません。反対に、見た目はあるけれど当たり判定のない装飾の上に、NavMeshができてしまうこともあります。

直し方は、Use GeometryをPhysics Collidersに変えてBakeを押し直すだけ。公式ドキュメントでも、Physics Collidersのほうが物理的な境界の端まで近づけると書かれています。キャラクターが実際に立つのはコライダーの上なので、個人的には床の形が複雑なステージほどPhysics Collidersが扱いやすいと思います。

原因3:Collect ObjectsとInclude Layersで床が外れている

ベイクの材料を絞る設定が、思った以上に床を外してしまうことがあります。NavMesh SurfaceのObject Collectionを開いて、次の2つを見てください。

Collect Objectsの4つの選択肢

表示名 材料になる物 よくある失敗
All Game Objects(初期値) シーンのアクティブな全オブジェクト 余計な物まで入る
Volume 箱の範囲に重なるアクティブな物 箱が小さくて床がはみ出す
Current Object Hierarchy Surfaceを付けた物とその子 床が子になっていない
NavMeshModifier Component Only NavMesh Modifierを付けた物(と、Apply To Childrenなら子) 床にModifierを付け忘れる

空のオブジェクトにNavMesh Surfaceを付けて、Collect ObjectsをCurrent Object Hierarchyにしている場合は要注意です。床や壁がそのオブジェクトの子になっていないと、材料が何もない状態でベイクされます。Unityのissue trackerにも、同じ理由(子だけを集める設定)でNavMeshが作られないという報告があり、仕様どおりの動きとして閉じられていました。

どの選択肢でも「アクティブな」オブジェクトだけが対象なので、非表示(チェックを外した)にしている床も材料に入りません。

Include Layersで外れているケース

Include Layersは、どのレイヤーの物を材料にするかの指定です。初期値はEverything。ここでPlayerやEnemyのレイヤーを外すのはよくある使い方ですが、そのとき床のレイヤーまで一緒に外していないか見てください。床に専用のレイヤー(Groundなど)を作った直後は、特に起こりやすいです。

ちなみに、NavMesh AgentやNavMesh Obstacleを付けたオブジェクトは、ベイクの時に自動で材料から外されます。床のオブジェクトにテストでAgentを付けたままにしていると、その床だけNavMeshができません。

原因4:エージェントの大きさに対して通路や段差が合っていない

床は材料に入っているのに、通路や2階だけNavMeshが欠ける。その場合は、エージェントの大きさの設定を疑います。設定の場所はWindow > AI > NavigationのAgentsタブです。初期のHumanoidは、プロジェクトの設定ファイルで次の値になっていました。

項目 初期値 欠ける場所
Radius 0.5 幅が狭い通路・壁ぎわ
Height 2 天井の低い所・机の下
Step Height 0.75 高い段差の上
Max Slope 45(度) 急な坂・階段を坂にした所

Radiusはエージェントの中心が壁や崖にどこまで近づけるかの値なので、NavMeshは壁から0.5ずつ内側に縮んで作られます。幅1mの通路なら、両側から0.5ずつ削られて、残りはほぼゼロ。小さな敵しか通らない通路なら、Radiusを小さくした新しいエージェントを+で追加して、敵のNavMesh AgentとNavMesh SurfaceのAgent Typeをそれに合わせてください。

Agentsタブの値を変えても、作ってあるNavMeshは自動では変わりません。変えたらBakeを押し直すまでが1セットです。

階段は、段ごとの高さがStep Heightを超えると登れません。見た目は階段のまま、当たり判定だけ坂のコライダーにしておき、Use GeometryをPhysics Collidersにする方法がよく使われます。

原因5:小さな床が「Minimum Region Area」で消されている

広い床から離れた小さな足場、たとえば台の上や細い橋だけNavMeshがない場合は、NavMesh SurfaceのAdvancedにあるMinimum Region Areaが原因かもしれません。初期値は2で、これより面積の小さい離れ島は、ベイクの途中で取り除かれます。

小さい足場を残したいなら、この値を0.5や0など小さくしてBakeし直します。公式ドキュメントには、タイルの境目にまたがる小さな島は値を上げても消えないことがある、とも書かれていました。消したいのに消えない時は、NavMesh ModifierでNot Walkableにするほうが確実です。

もう1つ、細い通路がガタガタに欠ける時は、同じAdvancedのOverride Voxel Sizeも候補になります。初期のボクセルはRadiusの3分の1の大きさで、狭い屋内なら1つのRadiusあたり4〜6個、という目安がドキュメントにありました。小さくするほどベイクに時間がかかるので、困った時だけ触れば十分です。

原因6:古い手順(Navigation StaticとBakeタブ)のまま探している

ネットで見つかる記事の多くは、Navigationウィンドウの「Bake」タブで焼いて、障害物には「Navigation Static」を付ける手順です。AI Navigationパッケージのアップグレードガイドによると、Unity 2022.2からナビゲーションはAI Navigationパッケージが受け持つ形に変わっています。Unity 6で新しく作る場合は、次の対応で読み替えてください。

昔の手順 Unity 6での手順
NavigationウィンドウのBakeタブ NavMesh SurfaceのBakeボタン
Navigation Static NavMesh Modifier(Remove Objectで除外、Override Areaでエリア変更)
BakeタブのAgent Radius Window > AI > NavigationのAgentsタブ
Off Mesh Link NavMesh Link

NavMesh Surfaceが見つからない時は、Window > Package ManagerのUnity Registryで「AI Navigation」が入っているかを見ます。2.0系はUnity 6000.0以降が対象です。追加できたら、床を選んでAdd Component > Navigation > NavMesh Surface、またはGameObject > AI > NavMesh Surfaceで作れます。

昔の方法でベイクした古いプロジェクトを開いた場合は、Window > AI > Navigation Updaterで変換できます。ガイドの説明では、シーンに埋め込まれていたNavMeshは「Navigation」という名前の新しいオブジェクトのNavMesh Surfaceに移り、Navigation StaticだったものにはNavMesh Modifierが付きます。

以前に配布されていたGitHub版のNavMeshComponentsのスクリプトがプロジェクトに残っていると、パッケージと名前がぶつかってエラーになるとも書かれています。Consoleに同じクラス名のエラーが出ていたら、古いスクリプトを消してください。コンパイルエラーの読み方はこちらにまとめています。

原因7:ゲーム中だけNavMeshがない(無効化・実行時ベイク)

エディタでは青く見えているのに、再生すると敵が動かない。そんな時は、NavMeshがゲーム中に読み込まれているかを疑います。公式ドキュメントによると、NavMeshのデータを読み込むのは、有効なNavMesh Surfaceが付いたアクティブなオブジェクトだけ。床の親オブジェクトをスクリプトで一度非表示にすると、その間はNavMeshも消えます。

再生中にNavMeshがあるかを確かめるスクリプト

目で見て分からない時は、Consoleに出すのが早いです。敵のオブジェクトに付けて再生してください。

using UnityEngine;
using UnityEngine.AI;

// 再生した瞬間に、NavMeshが読み込まれているかと、
// このオブジェクトの足元にNavMeshがあるかをConsoleに出す
public class NavMeshChecker : MonoBehaviour
{
    [SerializeField] float searchRadius = 2f; // 足元から探す範囲(m)

    void Start()
    {
        // シーンに読み込まれている全NavMeshの形を取り出す
        NavMeshTriangulation tri = NavMesh.CalculateTriangulation();
        Debug.Log($"読み込まれているNavMeshの頂点数: {tri.vertices.Length}");

        // 足元の近くにNavMeshがあるかを調べる
        if (NavMesh.SamplePosition(transform.position, out NavMeshHit hit, searchRadius, NavMesh.AllAreas))
        {
            Debug.Log($"{name}: {hit.distance:F2}m先にNavMeshがあります");
        }
        else
        {
            Debug.LogWarning($"{name}: 半径{searchRadius}m以内にNavMeshがありません");
        }
    }
}

頂点数が0なら、NavMeshがまったく読み込まれていません。頂点数はあるのに足元が見つからない場合は、敵の置き場所が床から離れすぎているか、別の島に乗っています。

ステージを自動で作るなら実行時にベイクする

ダンジョンを自動生成するゲームのように、再生してから床を並べる場合は、エディタでベイクしたNavMeshは使えません。床を並べ終わったあとに、スクリプトからBuildNavMesh()を呼びます。

using UnityEngine;
using Unity.AI.Navigation;

// ステージを作ったあとにNavMeshを焼き直す
public class RuntimeNavMeshBaker : MonoBehaviour
{
    [SerializeField] NavMeshSurface surface; // 床の親に付けたNavMesh Surface

    void Start()
    {
        // ステージを並べる処理のあとで呼ぶ
        surface.BuildNavMesh();
    }

    // 扉が開いた・壁が壊れたなど、一部だけ変わった時に呼ぶ
    public void Refresh()
    {
        if (surface.navMeshData == null)
        {
            surface.BuildNavMesh(); // まだ一度も焼いていなければ全体を焼く
            return;
        }
        surface.UpdateNavMesh(surface.navMeshData); // 変わった所だけ非同期で焼き直す
    }
}

ここで落とし穴が1つあります。Use GeometryがRender Meshesのまま実行時にベイクすると、ビルドしたゲームでは、Read/Writeが無効なメッシュが材料から外されます。Unity 6000.3のプレイヤー本体には「RuntimeNavMeshBuilder: Source mesh … is skipped because it does not allow read access」というメッセージが入っていました。

実行時にベイクするなら、モデルのImport SettingsでRead/Write Enabledにチェックを入れるか、Use GeometryをPhysics Collidersにしてください。エディタの再生では動くのにビルドだけ失敗する時は、Player.logにこのメッセージが出ていないかを見ます。

using Unity.AI.Navigation;を書き忘れると、NavMeshSurfaceが見つからないというエラーになります。上の2本のスクリプトは、Unity 6000.3.14f1とAI Navigation 2.0.12のDLLでビルドが通ることを確かめました(エディタ上での実行はしていません)。

ベイクできたのに敵が動かない時は

青い範囲が出たのに敵が止まったまま、という場合は、ベイクではなくNavMesh Agentやスクリプトの側の問題です。「SetDestination can only be called on an active agent」のエラーや、Agent Typeの食い違い、Stopping Distanceの値などは、追跡の記事の後半で順番に確かめています。

歩くアニメーションが滑る・向きがおかしい時は、NavMeshを使った時のアニメーションの設定を見てください。

NavMeshの面倒な調整を自分でやらずに、敵AIごとまとめて済ませたい人もいると思います。巡回や視界まで入った敵AIのアセットや、NavMeshを使わずに経路探索するA* Pathfinding Projectは、こちらで比べています。

有料の敵AIアセットは1万円を超えるものもあるので、急がないならセールの時期を待つのも手です。毎月のセール情報はこちらで更新しています。

まとめ|NavMeshのベイクは「見えているか」「材料に入っているか」の順で

NavMeshがベイクできない時は、次の順で確かめると早く片づきます。

1. NavMesh Dataの欄を見る(Noneか、アセット名か)
2. AI NavigationオーバーレイのShow NavMeshとShow Only Selectedを見る
3. Use Geometry(Render Meshes / Physics Colliders)を床の作りに合わせる
4. Collect ObjectsとInclude Layersで床が外れていないか見る
5. Agentsタブの大きさと、Minimum Region Areaを見る
6.ゲーム中だけ無い時は、Surfaceの有効・無効と実行時ベイクのRead/Writeを見る

最初はオーバーレイが閉じているだけ、ということが本当に多いです。設定を変える前に、まず「見えているか」から確かめてみてください。

敵AIの土台になるアセットを探している人は、セール時におすすめの人気アセット40選もあわせてどうぞ。買うタイミングはUnityアセットストアのセール情報で確認できます。

著者プロフィール
うんくん

IT系に特化した記事がメインです。(Unity多め。)
Udemy講師もやっています。よろしくお願いします。

※Amazonのアソシエイトとして、当メディアは適格販売により収入を得ています。

うんくんをフォローする
unityunity基本操作
スポンサーリンク
シェアする
うんくんをフォローする