みなさんこんにちは。
NakaRyoです。
今回は「AI活用ガイド」Part3として、
Unreal EngineでCPU(敵キャラクター)の攻撃アニメーションを実装する方法を解説します。
この記事はPart1(AI制御編)・Part2(移動/追跡アニメーション編)の続きとなりますので、
まだご覧になっていない方はそちらを先に確認することをおすすめします。
ブループリントインターフェースの作成
まずは、AIキャラクター(CPU)が攻撃アクションを実行できるようにするための
**命令機能(インターフェース)**を作成します。
コンテンツブラウザで「AI」フォルダ上を右クリック
ブループリント → ブループリントインターフェース を選択

ファイル名を BP_Attack にリネーム

BP_Attackを開いたら、新規関数を追加し名前を「Attack」に変更します。
完了したらコンパイルして保存します。

攻撃タスク(BTTask)を作成
次に、Behavior Treeから呼び出す「攻撃命令タスク」を実装します。
BT_Enemy を開き、新規タスク → BTTask_BlueprintBase を選択

名前を「BTTask_Attack」に変更し、AIフォルダへ保存

BTTask_Attack を開き、My Blueprint → 関数(オーバーライド) → Receive Execute AI を選択します。
以下のノード構成を設定します。
Event Receive Execute AI ノード手順
Event Receive Execute AIの実行ピンからノード展開し、
クラス⇒BP Attack⇒Attack(Message)を選択し、ノード接続


Event Receive Execute AIのControlled PawnピンとAttack(Message)のTargetピンを接続

Attack(Message)の実行ピンとFinish Executeの実行ピンを接続
Finish ExecuteのSuccessをチェック(true化)

コンパイルして保存します。
上記設定によりBehavior Treeの実行中に「Attack」関数が呼ばれ、攻撃モーションを実行する命令が送信されます。
Behavior Tree(BT_Enemy)への追加
BT_Enemy を開き、BlackBoard Condition・Sequence②に
先ほど作成したBTTask_AttackとWait(1秒)を追加します。

これにより、「追跡 → 攻撃 → 一時待機」という一連のAIアクションが流れるようになります。
BP_Enemy インターフェース実装
BP_Enemy を開き、クラス設定 →詳細パネル⇒ インターフェース → 追加 をクリック
「BP_Attack」を追加します。


次にイベントグラフを開き、右クリックで Attackをクリック⇒“イベントを実装” を選択。

「Event Attack」ノードが追加確認後、
以下ノード設定を行います。
Event Attackノード手順
新規変数を作成
マイブループリント⇒変数⇒+ボタンを選択

変数名:Attacking
変数型:Boolean

変数をグラフ上にドラッグ&ドロップ → Set Attacking を配置

Event Attack の実行ピン → Set Attacking の実行ピンを接続
Set Attacking のチェックを入れて「True」に設定

コンパイルして保存します。
アニメーションブループリントの更新
ABP_Enemy を開き、マイブループリント⇒変数⇒+ボタンを選択し、
新規変数を作成します。

変数名:Attacking
変数型:Boolean

イベントグラフ内の「Event Blueprint Update Animation」
に以下ノードを追加します。
Event Blueprint Update Animationノード手順
Set Speedの実行ピンとCast to BP_Enemyの実行ピンを接続
Try Get Pawn OwnerのReturn ValueピンとCast to BP_EnemyのObjectピンを接続

Cast to BP_Enemyの実行ピンとSet Attackingの実行ピンを接続
Cast to BP_EnemyのAs BP_EnemyピンとGet AttackingのTargetピンを接続
Get AttackingのReturn ValueピンとSet AttackingのAttakingピンを接続

コンパイルして保存します。
上記の設定でキャラクターの攻撃状態がアニメーションブループリントに同期されるようになります。
Root State Machine の設定
ABP_Enemy の「Root State Machine」タブを開きます。
アセットブラウザで「MM_Attack_01」を検索し、グラフへドラッグ&ドロップ。

MM_IdleからMM_Attack_01をトランジション接続
MM_Unarmed_Walk_FwdからMM_Attack_01をトランジション接続

トランジション条件設定
Idle → Attack
MM_IdleからMM_Attack_01の
トランジションマークをダブルクリックし、
ノードを以下の通りに設定します。

Get AttackingのReturn ValueピンとResultのCan Enter Transitionを接続

Walk → Attack
MM_Unarmed_Walk_FwdからMM_Attack_01の
トランジションマークをダブルクリックし
以下ノード設定をおこないます。

Get AttackingのReturn ValueピンとResultのCan Enter Transitionを接続

Attack → Idle
MM_Attack_01からMM_Idleの
トランジションマークをダブルクリックし
以下ノード設定をおこないます。

Get AttackingのReturn ValueピンとNot Booleanの実行ピンを接続
Not BooleanのReturn valueピンとResultのCan Enter Transitionピンを接続

コンパイルして保存します。
これで攻撃状態が終了した際、Idleへ戻るルールが完成します。
攻撃終了イベント(Anim Notify)の実装
攻撃モーションの終了をAI側に通知する仕組みを作成します。
BP_Attack に関数追加
マイブループリント⇒関数⇒+ボタンを選択し、新規関数を追加します。
新規関数名:Anim_Event


詳細パネルのインプット⇒+ボタンでインプットを追加します。
インプット名:Event
インプット型:Name

コンパイルして保存します。
AnimNotify Blueprint を作成
AIフォルダに移動し、
右クリック → Blueprintクラス → AnimNotifyを選択


名前を BP_AN_Enemy にリネーム

BP_AN_Enemy を開き、Received Notify をオーバーライドして
以下ノードを作成します。
Received Notifyノード手順
マイブループリント⇒変数⇒+ボタンで新規変数作成
変数名:AnimEvent
変数型:Name

AnimEvent変数の詳細パネルでインスタンス編集可能にチェックを入れる

Received Notifyの実行ピンからノード展開し、
Anim Event(Message)と接続します。


Received NotifyのMesh CompピンとGet OwnerのTargetピンを接続
Get OwnerのReturn ValueピンとAnim Event(Message)のTargetピンを接続

Get AnimeEvent(変数)とAnim EventのEventピンを接続

Anim Eventの実行ピンとReturn Nodeの実行ピンを接続

コンパイルして保存します。
攻撃アニメーションへ通知を追加
MM_Attack_01 を開きます。
MM_Attack_01はコンテンツ内から検索するか、
/All/Game/Characters/Mannequins/Anims/Unarmed/Attackに格納されています。
※ThirdPersonスターターキットがデフォルトで入っている場合

編集画面で、1のアニメーションフレームの
最終フレーム部分を右クリック⇒”通知を追加”を選択

通知対象を BP_AN_Enemy に設定。

最終フレームに通知指定したBP_AN_Enemyを選択し、
詳細パネルの「Anim Notify → Default → AnimEvent」に EndAttack と入力。

保存します。
攻撃終了処理(BP_Enemy)
BP_Enemy を開き、イベントグラフへ移動。
マイブループリント⇒インターフェース
→ Anim_Eventを右クリック → イベントを実装 を選択
以下のノード設定をおこないます。
Event Anim_Eventノード構成
Event Anim_Eventの実行ピンとBranchの実行ピンを接続
Event Anim_EventのEventピンと==(Equal)のAピンを接続

==(Equal)のBピン欄に”EndAttack”と記載
※注意:Bピン欄記載のEndAttackはMM_Attack_01
と設定したEndAttackと同一内容でないと動作しないため、
記載内容を合わせる必要があります。
MM_Attack_01の記載した内容を
コピー&ペーストすることをおすすめします。

==(Equal)のReturn ValueピンとBranchのConditionピンを接続
BranchのTrueピンとSet Attackingの実行ピンを接続
Set AttackingのAttackingのチェックは外したままにする(False化)

コンパイルして保存します。
攻撃アニメーションが終了した際に自動で
「Attacking = False」となり、Idle状態へ戻る仕組みが完成します。
動作確認
シミュレーションを実行すると、以下のような挙動が確認できます:

プレイヤーを検知後、追跡 → 攻撃モーション → 待機(再行動)
攻撃終了時にIdleへ自動復帰
この一連の流れがスムーズに動作していれば、攻撃アニメーションの実装は成功です。
まとめ
本記事では、Unreal EngineのAIキャラクターに
攻撃アクションを追加する手順を詳しく紹介しました。
ブループリントインターフェースによる攻撃命令、
Behavior Treeでのタスク制御、AnimNotifyによる
アニメーション完結通知までを組み合わせることで、
プレイヤーを感知して追跡・攻撃する自然なAI挙動を実現できます。
