9.

Unreal Engine AI MoveTo 完全ガイド(NavMesh / AIController / Behavior Tree)

編集
この記事の要点
  • AI MoveTo ノードで AIController が Pawn を目的地まで自動移動させる
  • 前提: NavMesh Bounds Volume 配置 + RecastNavMesh 自動生成 + Pawn に AIController
  • 引数: Target Actor(追従)または Target Location(座標)、Acceptance Radius
  • 実行結果は Success / Failed / AbortedOn Success / On Fail 出力ピン
  • Behavior Tree なら Move To タスクを使うのが定番(Blackboard のキーから自動取得)

AI MoveTo ノードとは

AI MoveTo は、AIController がコントロールする Pawn を NavMesh 上で目的地まで自動的に動かす Blueprint ノードです。手動で SetActorLocation を呼ぶよりずっと賢く、経路探索(Pathfinding)障害物回避を内蔵しています。

RTS の選択ユニット移動、敵 AI のパトロール、NPC の目的地移動、リターゲットなど、ゲーム AI の根幹となるノードです。

動作するための前提条件

  1. NavMesh Bounds Volume をシーンに配置(このボリュームの範囲内で経路探索可能になる)
  2. NavMesh がRecastNavMesh アセットとして自動生成される(青く塗られた地面が表示される)
  3. 動かしたい Pawn に AIController がアタッチされている(Pawn の AIControllerClass プロパティ)
  4. Auto Possess AI が「Placed in World or Spawned」
  5. Pawn に CharacterMovementComponent 等の移動コンポーネントがある

NavMesh の確認

[Show NavMesh の表示]
ビューポート上で P キー押下 → NavMesh の青色表示が切り替わる
表示されていない場合:
  - NavMesh Bounds Volume が無い
  - Volume の範囲が地面を含んでいない
  - 地面が Static でない
  - Project Settings > Navigation Mesh の設定不足

[RecastNavMesh プロパティ]
  - Cell Size: 経路解像度(小さくすると詳細だが重い)
  - Agent Radius: 通れる隙間の幅
  - Agent Height: 通れる高さ
  - Tile Size: 動的更新の単位

基本: 場所への移動

[Blueprint Node]
AI MoveTo
  Pawn               = Self (Controlled Pawn)
  Destination        = Target Location (Vector)
  Acceptance Radius  = 50.0
  Stop on Overlap    = true
  Use Pathfinding    = true
  Can Strafe         = false
  Filter Class       = (None or NavQueryFilter)

[出力ピン]
  On Success → 目的地到着時
  On Fail    → 経路不能 / 中断時
  Movement Result (enum: EPathFollowingResult)

C++ での呼び方

#include "Blueprint/AIBlueprintHelperLibrary.h"

void AMyAIController::MoveToTarget()
{
    APawn* MyPawn = GetPawn();
    if (!MyPawn) return;

    // 場所指定
    FVector Dest(1000.f, 500.f, 0.f);
    UAIBlueprintHelperLibrary::SimpleMoveToLocation(
        this, Dest);

    // Actor 追従
    AActor* Target = TargetActor;
    UAIBlueprintHelperLibrary::SimpleMoveToActor(
        this, Target);

    // 詳細制御 (低レベル API)
    FAIMoveRequest MoveReq;
    MoveReq.SetGoalLocation(Dest);
    MoveReq.SetAcceptanceRadius(50.f);
    MoveReq.SetUsePathfinding(true);
    MoveTo(MoveReq);
}

Actor を追従する

Pawn (プレイヤーなど)が動き続ける Actor の場合、MoveTo に Target Actor を渡せば自動的に追跡します:

[Tick Event] (毎フレームは重いので 1 秒間隔等にする)
  Get Player Pawn → Target Actor

AI MoveTo
  Pawn               = Self
  Target Actor       = (Player Pawn)
  Acceptance Radius  = 200.0  ← 攻撃範囲
  → On Success: Attack Player

Movement Result の意味

Result意味対処
Success目的地到達次の行動へ
Failure経路が見つからない / Pawn が居ないNavMesh の範囲 / 障害物確認
AbortedStopMovement / 別 MoveTo で中断意図的なので無視可
Skipped同じ目的地で既に呼び中無視
Invalidパラメータ不正引数を見直し

Acceptance Radius と Stop on Overlap

  • Acceptance Radius = 目的地からこの距離以内に入ったら到着扱い。0 にすると正確だが微振動の原因に → 50〜100 が無難
  • Stop on Overlap = ターゲット Actor の Collider に重なった瞬間に停止(追従用、Pawn の Capsule 半径を考慮)

Behavior Tree から使う(推奨)

本格的な AI 開発では Behavior Tree (BT) の中で Move To タスクを使うのが定番です。Blackboard キーと連携させることで動的な目的地に追従できます:

[Behavior Tree 構造例]
Selector (戦闘ロジック)
├ Sequence "追跡"
│  ├ Wait (0.3s)
│  └ Move To (Blackboard Key = "TargetActor")
└ Sequence "巡回"
   ├ Find Random Location In NavMesh → Set as "PatrolLocation"
   ├ Move To (Blackboard Key = "PatrolLocation")
   └ Wait (Random 2-5s)

[Blackboard]
TargetActor    (Actor)
PatrolLocation (Vector)

[AIController]
RunBehaviorTree(MyBT) → BT が自動的に Move To タスクを実行

NavMesh の動的更新

シーン中に動的に障害物を置く(壊せる壁、生成されるオブジェクト等)場合、NavMesh を動的に更新する必要があります:

  • RecastNavMesh アセットの Runtime Generation = Dynamic に設定
  • 動的障害物には NavModifier Component またはNavModifierVolume
  • Project Settings > Navigation Mesh > Tile Numlines Cache 等で性能調整

NavQueryFilter で経路選択をカスタム

特定のエリアを避ける、コストを変える等を実現するには NavArea + NavQueryFilter を設計します:

[Custom NavArea]
NavArea_Water   (NavAreaCost = 10.0, 水中は遅い)
NavArea_Lava    (NavAreaCost = 100.0, ほぼ避ける)
NavArea_Default (NavAreaCost = 1.0)

[NavQueryFilter]
NavQueryFilter_Cautious:
  NavArea_Lava 通行不可
  NavArea_Water コスト 50x

AI MoveTo の Filter Class = NavQueryFilter_Cautious
→ Lava を避けるルートを選ぶ

よくあるトラブル

症状原因対処
動かないNavMesh が無い / 範囲外P キーで NavMesh 確認
動かないAIController がアタッチされていないPawn の AIControllerClass 設定
動かないAuto Possess AI が "Disabled""Placed in World or Spawned" に
挙動が震えるAcceptance Radius が小さい50-100 に増やす
段差が登れないRecastNavMesh の Step Height 不足Cell Height / Step Height 調整
NavMesh が地形に張り付かない地面が Static でない / NavMesh Bounds の高さ不足地形を Static、Volume 拡大
追従が遅い / カクつくTick で毎フレーム MoveTo してる0.5 〜 1s 間隔で十分

FAQ

Q: 飛行する敵に AI MoveTo を使いたい
A: NavMesh は 2D(床ベース)なので飛行には不向き。FloatingPawnMovement + 自前経路探索、または SVO Navigation プラグイン、またはNavLinkProxy でジャンプ・滑空指示。

Q: 経路の途中で停止させたい
A: AIController の StopMovement() を呼ぶ。または別の MoveTo を呼べば前の MoveTo は自動的に Abort されます。

Q: NavMesh 生成が遅い
A: Recast の Cell Size を大きく(例 19→30)、Tile Size を見直す。エディタ起動時は重くなりがちなので Build Navigation を手動実行に変えるのも手。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Event BeginPlay
  2. Event ActorBeginOverlap
  3. Event Tick
  4. on component begin overlap
  5. On Component Hit
  6. CameraBoom(Spring Arm)
  7. Get Player Character
  8. Nav Mesh Bounds Volume
  9. AI MoveTo
  10. Pawn
  11. Create Render Target 2D
  12. Take High Res Screenshotノード
  13. Sphere Reflection Capture
  14. Event Tickノード
  15. ウィジェットのキャンバスパネル
  16. DefaultSceneRoot
  17. FloatingPawnMovement
  18. Set World Rotation
  19. Event Any Damage
  20. FloatingPawnMovement
  21. Set World Rotation
  22. VInterp To
  23. Get Socket Transform