UE Blueprintで作る○○なゲーム

UE Blueprintで作る巡回と追跡機能を備えたAI

Tags: Blueprint, AI, ゲーム開発, チュートリアル, Unreal Engine

はじめに

Unreal Engine (UE) を用いたゲーム開発において、AI(人工知能)の実装は、プレイヤーに没入感のある体験を提供するために不可欠な要素です。多くのゲームでは、敵キャラクターやNPC(Non-Player Character)が自律的に動き、プレイヤーとインタラクションすることで、ゲーム世界に奥行きが生まれます。

本記事では、プログラミング経験をお持ちの皆様が、UEのBlueprintのみを用いて、シンプルな巡回(Patrol)とプレイヤー追跡(Chase)の機能を備えたAIキャラクターを実装する方法を詳細に解説します。C++を用いることなく、視覚的なスクリプティングでAIのロジックを構築する手法を学び、Blueprintの効率的な活用方法を習得することを目標とします。

Blueprintは、WebエンジニアとしてJavaScriptやPythonなどのプログラミング言語に習熟されている方々にとって、変数の概念、関数の呼び出し、条件分岐といった基本的なプログラミング要素が視覚的に表現されているため、比較的スムーズに学習を進めることができます。本記事を通じて、Blueprintが提供する迅速なプロトタイピングとイテレーションの利点を実感してください。

AIの基礎設定と準備

AIキャラクターを動かすためには、いくつかの基礎的な設定が必要です。

1. Nav Mesh Bounds Volumeの配置

AIが移動可能な領域をUnreal Engineに認識させるために、「Nav Mesh Bounds Volume」をレベルに配置します。

  1. UEエディタの「Modes」パネルから「Volumes」を選択します。
  2. 「Nav Mesh Bounds Volume」をレベルにドラッグ&ドロップします。
  3. このボリュームのスケール(Rキーを押しながら調整)と位置を調整し、AIが移動する予定の全ての領域を覆うように設定します。
  4. 設定後、Nav Mesh(緑色のメッシュ)が生成されていることを確認してください。表示されていない場合は、Pキーを押すことで表示/非表示を切り替えることができます。

2. AIコントローラーの作成

AIキャラクターの思考を制御する「AI Controller」を作成します。これは、プログラミングにおけるAIの「脳」に相当する部分です。

  1. コンテンツブラウザで右クリックし、「Blueprint Class」を選択します。
  2. 「All Classes」を展開し、「AIController」を検索して選択し、「Select」をクリックします。
  3. 名前を「BP_AIController_Basic」などとします。
  4. 作成したAIキャラクターのBlueprintを開き、DetailsパネルのPawnカテゴリにあるAI Controller Classを先ほど作成した「BP_AIController_Basic」に設定します。

3. AIキャラクターBlueprintの準備

ベースとなるAIキャラクターのBlueprintを作成します。今回はCharacterクラスを継承したBlueprintを使用します。

  1. コンテンツブラウザで右クリックし、「Blueprint Class」を選択します。
  2. 「Character」を選択し、名前を「BP_AI_Enemy」などとします。
  3. このBlueprintを開き、Meshコンポーネントにスケルタルメッシュを設定し、Anim Classも設定します。CapsuleComponentCharacterMovementコンポーネントはデフォルトで含まれています。

AIステートの定義

AIの行動を管理するために、ステート(状態)を定義します。これは、プログラミングにおける列挙型(enum)に非常に似ています。

  1. コンテンツブラウザで右クリックし、「Blueprints」→「Enumeration」を選択します。
  2. 名前を「E_AIState」などとします。
  3. E_AIStateを開き、以下のようなエントリーを追加します。
    • Idle (待機)
    • Patrolling (巡回中)
    • Chasing (追跡中)
    • Attacking (攻撃中) - オプション

巡回ロジックの実装

AIが決められた地点間を移動する巡回ロジックを実装します。

1. 巡回地点の定義

BP_AI_Enemy Blueprintを開きます。

  1. Variablesパネルで新しい変数を作成し、名前を「PatrolPoints」とします。
  2. 変数の型を「Vector」にし、右側のドロップダウンから「Array」(配列)を選択します。これは、複数の巡回地点を保持するためです。
  3. この変数の「Instance Editable」にチェックを入れます。これにより、レベル上の各AIインスタンスで巡回地点を個別に設定できるようになります。

2. 巡回ロジックのフロー

Event Graphに以下のノードを配置し、接続します。

  1. Event BeginPlayから開始します。
  2. Setノードで、現在のAIステートを示す変数(型はE_AIState、名前はCurrentAIStateなど)をPatrollingに設定します。
  3. 巡回地点のインデックスを管理するInteger型の変数「CurrentPatrolPointIndex」を作成し、0に初期化します。
  4. PatrolPoints配列からGet (a copy)ノードでCurrentPatrolPointIndexに対応する要素(Vector)を取得します。
  5. AI MoveToノードを呼び出します。
    • Target ActorにはSelf(このAIキャラクター自身)を接続します。
    • DestinationにはPatrolPointsから取得したVectorを接続します。
    • Acceptance Radiusは移動目標に到達したと見なす許容範囲を設定します(例: 50.0)。
    • On Successピンから、次の巡回地点への移動ロジックを接続します。
// BP_AI_Enemy Event Graph: 巡回ロジックの一部
// Event BeginPlay
// -> Set CurrentAIState (Patrolling)
// -> Set CurrentPatrolPointIndex (0)
// -> Get PatrolPoints (Array)
// -> Get (a copy) [CurrentPatrolPointIndex]
// -> AI MoveTo (Target Actor: Self, Destination: [Patrol Point Vector], Acceptance Radius: 50.0)
//
// AI MoveTo On Success
// -> Increment Integer (CurrentPatrolPointIndex)
// -> If (CurrentPatrolPointIndex >= Array Length of PatrolPoints)
//    -> Set CurrentPatrolPointIndex (0)
// -> Reroute to AI MoveTo again (using new CurrentPatrolPointIndex)

AI MoveToOn Successピンは、AIが目標地点に到達したときに実行されます。ここに、CurrentPatrolPointIndexをインクリメントし、配列の最後なら0に戻すロジック(Increment IntegerBranchArray Lengthなどを使用)を接続し、再度AI MoveToを呼び出すようにループさせます。

追跡ロジックの実装

AIがプレイヤーを検出した場合に追跡するロジックを実装します。

1. プレイヤー検出

プレイヤーを検出する方法はいくつかありますが、ここでは比較的シンプルなPawn Sensingコンポーネントを使用します。

  1. BP_AI_Enemy Blueprintで、「Components」パネルの「Add」ボタンをクリックし、「Pawn Sensing」を追加します。
  2. DetailsパネルでPawn Sensingコンポーネントの設定を調整します。
    • Peripheral Vision Angle:視認できる角度(例: 90.0
    • Sight Radius:視認できる距離(例: 2000.0
  3. Event GraphでPawn Sensingコンポーネントを選択し、Detailsパネルの一番下にあるOn See Pawnイベントを追加します。

2. 追跡ロジックのフロー

On See Pawnイベントが発火したら、AIステートをChasingに切り替え、プレイヤーを追跡します。

  1. On See PawnイベントからSetノードでCurrentAIStateChasingに設定します。
  2. AI MoveToノードを呼び出します。
    • Target ActorSelf
    • DestinationにはOn See PawnイベントのPawnピンから取得したプレイヤーキャラクターのGet Actor Locationを接続します。
    • Acceptance Radiusは適宜設定します(例: 150.0)。
// BP_AI_Enemy Event Graph: 追跡ロジックの一部
// On See Pawn (Pawn: Other Pawn)
// -> Set CurrentAIState (Chasing)
// -> Get Actor Location (Pawn: Other Pawn)
// -> AI MoveTo (Target Actor: Self, Destination: [Other Pawn Location], Acceptance Radius: 150.0)
//
// AI MoveTo On Success (追跡中の処理)
// -> Branch (条件: CurrentAIState == Chasing)
//    -> True: Get Actor Location (Pawn: Other Pawn) -> AI MoveTo (再追跡)
//    -> False: 巡回ロジックなどへ戻る

プレイヤーを見失った場合(例えば、視認範囲外に出た場合)や、AIが目標に到達した後もプレイヤーが動いている場合は、再度AI MoveToを呼び出す必要があります。これを実現するために、Event TickCurrentAIStateChasingの場合のみ、プレイヤーの位置を常に更新して追跡するように実装することも可能です。しかし、より効率的な方法は、AI MoveToOn Move Finishedイベントや、Pawn SensingOn Lose Sight Of Pawnイベントを提供していないため、タイマーやカスタムイベントを用いて定期的にプレイヤー位置をチェックする、またはBehavior Treeを使用することです。今回はシンプルなAI MoveToOn Successで再追跡を試みます。

より高度な追跡では、AI MoveToOn Request Failedピンを活用し、到達できない場合にステートをIdleに戻したり、別の行動に移したりするロジックも追加できます。

ステート遷移の管理と効率的なBlueprintの組み方

AIの行動は、現在のステートに基づいて適切に切り替わる必要があります。

1. ステートに基づく行動選択

Event Tickやカスタムイベント内で、CurrentAIState変数の値に応じて異なる行動を実行するロジックを組みます。プログラミングにおけるswitch文やif-else if文に相当します。

  1. Event TickからSwitch on E_AIStateノードを接続します。
  2. それぞれのピン(Idle, Patrolling, Chasing)から、対応するロジックを呼び出すカスタムイベントや関数を接続します。

2. ロジックの関数化

巡回や追跡のロジックをそれぞれBlueprint関数としてまとめることで、Blueprintグラフの可読性が向上し、再利用性が高まります。これは、プログラミングにおける関数定義と呼び出しに相当します。

  1. BP_AI_Enemy BlueprintのMy Blueprintパネルで、「Functions」の横にある「+」ボタンをクリックし、新しい関数を作成します(例: StartPatrolStartChase)。
  2. 先ほどEvent Graphに直接記述した巡回と追跡のロジックを、それぞれの関数内に移動させます。
  3. Event TickSwitch on E_AIStateから、適切な関数を呼び出します。
// BP_AI_Enemy Event Graph: ステート管理の例
// Event Tick
// -> Switch on E_AIState (Input: CurrentAIState)
//    -> Patrolling: Call Function StartPatrol
//    -> Chasing: Call Function StartChase
//    -> Idle: (何もしない、または待機アニメーション再生など)

// Function StartPatrol の内部例
// -> Get PatrolPoints (Array)
// -> Get (a copy) [CurrentPatrolPointIndex]
// -> AI MoveTo (Target Actor: Self, Destination: [Patrol Point Vector], Acceptance Radius: 50.0)
//    -> On Success: Increment CurrentPatrolPointIndex, Loop back if at end, etc.

// Function StartChase の内部例
// -> Get Player Character -> Get Actor Location
// -> AI MoveTo (Target Actor: Self, Destination: [Player Location], Acceptance Radius: 150.0)
//    -> On Success: (再度StartChaseを呼び出し、プレイヤーを追い続けるロジックなど)

このように関数化することで、各ステートの責任範囲が明確になり、デバッグや改修が容易になります。

まとめと次のステップ

本記事では、Unreal EngineのBlueprintのみを用いて、AIキャラクターが特定の地点を巡回し、プレイヤーを検出した場合に追跡する基本的なロジックを実装する方法を解説しました。Nav Mesh Bounds Volumeによる移動範囲の指定、AI Controllerの役割、そしてPawn SensingコンポーネメントとAI MoveToノードを活用した具体的な実装手順を学びました。

また、AIの行動を管理するためのステートの概念をEnumerationで定義し、Switch on E_AIStateによるステート遷移の基本と、ロジックをFunctionとしてカプセル化する効率的なBlueprintの組み方についても触れました。これは、プログラミングにおける構造化されたアプローチに非常に近い概念であり、大規模なプロジェクトでBlueprintを活用する上で非常に重要です。

この基本的なAIシステムは、あなたのゲームに生命を吹き込む第一歩です。ここからさらに発展させるために、以下の応用例を検討してみてください。

Blueprintは、アイデアを迅速に形にし、ゲームロジックを視覚的に構築するための強力なツールです。本記事で得た知識を基に、あなた自身のUEプロジェクトで、より魅力的でインタラクティブなAIキャラクターを創造してみてください。