【Unreal Engine】NavMeshの設定と最適化:Agent設定からRuntime Generationまで

作成: 2025-12-12

AIキャラクターの経路探索に使うNavMeshの設定方法と最適化について紹介。NavMesh Bounds Volumeの配置、Agent Radius/Heightの調整、Runtime Generationの選択基準、よくあるトラブルと対処法などを整理。

AIキャラクターをゲーム内で自然に、そして効率的に移動させることは、ゲームの没入感を高める上で非常に重要です。しかし、Unreal EngineでAIの経路探索を設定する際、「AIが壁にぶつかって動かない」「広いマップで動作が重くなる」といった問題に直面したことはありませんか?

これらの問題の多くは、Unreal Engineのナビゲーションメッシュ(NavMesh) の設定と最適化が不十分であることに起因します。本記事では、Unreal Engine初心者から中級者の方を対象に、NavMeshの基本設定から、パフォーマンスを最大化するための最適化テクニック、そしてBlueprintとC++を用いた実践的なAI移動制御までを徹底的に解説します。


NavMesh Bounds Volumeの設定

NavMeshは、AIが移動可能な領域を示すデータ構造です。Unreal Engineでは、このNavMeshを生成するためにNavMesh Bounds Volume という特殊なボリュームを使用します。

NavMesh Bounds Volumeの配置

  1. 配置: Place ActorsパネルからNavMesh Bounds Volumeをシーンにドラッグ&ドロップします。
  2. 範囲設定: 配置したボリュームのサイズと位置を調整し、AIが移動する全ての領域 を覆うようにします。
  3. 確認: エディタでPキー を押すと、NavMeshが生成された領域が緑色で表示されます。緑色の領域がAIの移動可能範囲です。

💡 よくある間違い: NavMesh Bounds Volumeのサイズが小さすぎたり、地面から浮いていたりすると、NavMeshが正しく生成されません。ボリュームの中心が地面にあり、移動させたい領域全体を完全に包含していることを確認してください。

プロジェクト設定での基本調整

NavMeshの生成精度や挙動は、Project SettingsNavigation Meshセクションで調整できます。

設定項目説明ベストプラクティス
Cell SizeNavMeshのグリッドの大きさ。小さいほど精度が上がるが、生成コストとメモリが増加する。通常はデフォルトで十分。細かい移動が必要な場合は小さくする。※
Cell HeightNavMeshのセルの高さ。デフォルト(25.0)で十分。
Agent RadiusAIキャラクターの半径。この半径に基づいて壁や障害物からの距離が計算される。AIキャラクターのCapsule Componentの半径と一致させる。
Agent HeightAIキャラクターの高さ。AIキャラクターのCapsule Componentの高さと一致させる。
Agent Max SlopeAIが登れる斜面の最大角度(度)。デフォルト(44度)で十分。急な斜面を登らせたい場合は上げる。
Agent Max Step HeightAIがまたげる段差の高さ。キャラクターの脚の長さを考慮して設定。デフォルトは35.0。

※ Cell Sizeのデフォルト値はエンジンバージョンにより異なる場合があります。お使いのバージョンで確認してください。

これらの設定は、AIキャラクターのサイズに合わせて調整することが、最も基本的なNavMeshの最適化となります。

AIが動けない場合のトラブルシューティング

AIがNavMesh上で動けない場合、以下を確認してください:

  • Agent Radius/Height: キャラクターより小さいと壁にぶつかり、大きすぎると狭い通路を通れなくなります。
  • Agent Max Slope: 斜面を登れない場合、この値が原因の可能性があります。
  • Agent Max Step Height: 段差を超えられない場合、この値を調整してください。

NavMeshの最適化テクニック

広いマップや動的な環境では、NavMeshの生成と更新がパフォーマンスのボトルネックになることがあります。以下の設定で最適化を図りましょう。

Runtime Generationの活用

Project Settings > Navigation Mesh > RuntimeカテゴリにあるRuntime Generationの設定は、パフォーマンスに最も影響を与える要素の一つです。

設定値説明推奨される状況
Staticエディタで一度だけNavMeshをビルドし、実行中は更新しない。ほとんどの静的なレベル。最高のパフォーマンス。
Dynamic Modifiers Onlyエディタでビルド後、実行中はNav Mesh Modifier Volumeなどによる変更のみを反映する。破壊可能なオブジェクトや開閉するドアなど、限定的な動的要素がある場合。
Dynamic実行中に常にNavMeshを更新する。完全に動的な環境(例:ボクセルベースのゲーム)。最もコストが高い。

🚀 最適化のヒント: 可能な限りStatic またはDynamic Modifiers Only を選択してください。Dynamicは非常にコストが高いため、本当に必要な場合にのみ使用を検討すべきです。

Nav Mesh Modifier Volumeの活用

特定のエリアでのみNavMeshの挙動を変更したい場合、Nav Mesh Modifier Volume を使用します。

  • エリアクラスの変更: 特定の領域を通行不可にしたり、異なるエリアクラスを割り当てて経路探索に影響を与えます。
  • コストの変更: 特定の地面(例:沼地)をAIが避けるように、経路探索のコストを局所的に上げることができます。

💡 動的なNavMesh更新について

Nav Mesh Modifier Volumeは、主にエリアの属性(コスト、通行可否)を変更 するためのものです。破壊された壁の穴など、新しい移動可能領域をNavMeshに反映させるには、Runtime GenerationDynamicまたはDynamic Modifiers Onlyに設定する必要があります。Modifier Volumeだけでは新しいNavMesh領域は「追加」されません。


AI移動制御の実装

NavMeshが正しく設定されたら、次はAIキャラクターを実際に移動させます。

BlueprintでのAI移動(AI MoveToノード)

最も簡単で一般的な方法は、AI MoveToノードを使用することです。

// AI Controller Blueprint
// Event: TargetLocationに移動する
Sequence
  -> AI MoveTo (Target Actor: None, Destination: TargetLocation, Target: Self)
    -> On Success (移動完了時の処理)
    -> On Fail (移動失敗時の処理)

このノードは、内部でNavMeshを利用して最適な経路を自動的に計算し、AIキャラクターを目的地まで移動させます。

C++でのAI移動(AAIController::MoveToLocation)

C++でより詳細な制御を行いたい場合は、AAIControllerクラスのMoveToLocation関数を使用します。

// MyAIController.cpp

#include "AIController.h"
#include "NavigationSystem.h"

void AMyAIController::MoveToTarget(const FVector& TargetLocation)
{
    // NavMeshが存在するか確認
    if (UNavigationSystemV1* NavSys = FNavigationSystem::GetCurrent<UNavigationSystemV1>(GetWorld()))
    {
        // 経路探索と移動を実行
        FAIMoveRequest MoveRequest;
        MoveRequest.SetGoalLocation(TargetLocation);
        MoveRequest.SetAcceptanceRadius(10.0f); // 目的地に到達したと見なす許容範囲

        FNavPathSharedPtr NavPath;
        MoveTo(MoveRequest, &NavPath);
    }
}

C++を使用することで、移動の成功/失敗時のコールバック処理や、移動中に経路を動的に変更するなどの高度なカスタマイズが可能になります。


賢いAIのためのチェックリスト

NavMeshの設定と最適化は、AIの挙動とゲームパフォーマンスの両方に直結します。

  1. NavMesh Bounds Volumeの確認: AIの移動範囲全体を覆っているか?Pキーで緑色の領域を確認しましたか?
  2. Agent設定の調整: AIキャラクターのサイズ(Radius/Height)に合わせてProject Settingsを調整しましたか?
  3. Runtime Generationの最適化: 静的なレベルではStaticまたはDynamic Modifiers Onlyを選択し、不要なランタイムコストを削減しましたか?
  4. 移動制御の実装: BlueprintのAI MoveToまたはC++のAAIController::MoveToを使用して、AIを正しく移動させていますか?

これらのステップを踏むことで、あなたのUnreal EngineプロジェクトのAIキャラクターは、より賢く、よりスムーズに、そしてパフォーマンスを損なうことなく移動できるようになるでしょう。