[Unreal Engine 5]animNotifyを使って攻撃モーションを作る

NPCと戦う機能を作る

AIキャラクターと戦う機能を作る part4

こちらのようなAIキャラクターと戦う機能を作っています。本記事では下の動画のように、プレイヤーに追いついたキャラクターに攻撃モーションを再生させる機能を作ります。

攻撃を行うタスクを発行する

プレイヤーに追いついたらビヘイビアツリーで攻撃タスクを発行し、アニメーションブループリントで攻撃モーションを再生させるようにします。

攻撃を通知するためにブループリントインターフェースを作ります。

「battle_ai」フォルダ上で右クリック→ブループリント→ブループリントインターフェースを選択して作成し、名称を「BP_I_battle_ai」とします。

「BP_I_battle_ai」を開きます。

「新規関数」という名称で用意されている関数を「attack」という名称にしておきます。

「BT_battle_ai」を開きます。

左上の「新規タスク」を選択し、「BT_Task_Attack」という名称でタスクを作成します。

「BT_Task_Attack」を開きます。

マイブループリントパネルの関数/オーバーライドから「Receive Execute AI」を選択します。
するとイベントグラフに「Event Receive Execute AI」が追加されます。

「Event Receive Execute AI」の続きに以下のようにノードを追加します。

先ほど作成したインターフェース「BP_I_battle_ai」の「attack」関数を追加し、「Target」に「Controled Pawn」を接続します。
「Finish Execute」を追加し「Success」にチェックを付けます。

「BT_battle_ai」を開きます。

「BTTask_chase_player」の右に「BTTask_Attack」と「Wait」を追加します。
「Wait」は2秒に設定しておきます。

「BP_battle_ai」を開きます。

「クラス設定」を選択した状態で詳細パネルの「実装インターフェース」/「追加」を選択して先ほど作成した「BP_I_battle_ai」を追加します。

イベントグラフに移ります。

Boolean型変数「attacking」を作成します。
「BP_I_battle_ai」の「Event Attack」を追加し、その続きに変数「attacking」をドラッグアンドドロップ、「Set attacking」(True)を追加します。

攻撃アニメーションを再生する

「ABP_battle_ai」を開きます。

こちらにもBoolean型変数「attacking」を作成します。
イベントグラフの「Event Blueprint Update Animation」の続きに下図のようにノードを追加します。

「Cast To BP_battle_ai」を追加して「Object」に「Try Get Pawn Owner」の出力ピンを接続します。
「As BP Battle Ai」から「get Attacking」ノードをつなぎ、その出力ピンを「set Attacking」に接続します。

「root State Machine」に移ります。

アセットブラウザから「Attack」をドラックアンドドロップします。
「Idle」から「Attack」に、「Walk」から「Attack」にトランジションを作成します。

「Idle」から「Attack」のトランジション、「Walk」から「Attack」のトランジションそれぞれを下図のように作ります。

「get Attacking」を「Can Enter Transition」に接続します。

次に「Attack」から「Idle」にトランジションを作成します。

「Attack」から「Idle」のトランジションには、「get Attacking」→「not boolean」を「Can Enter Transition」に接続します。

ここまで実装して、実行するとAIキャラクターがプレイヤーに追いついたときに攻撃するようになります。まだ「Attacking」フラグを下す処理を書いていないので、攻撃したまま停止します。

Anim_notifyのタイミングで攻撃を終了させる

Anim_notifyという機能を使って攻撃を終了するタイミングを発行して、攻撃モーションを終える処理を作成します。
Anim_notifyを使うことでアニメーション上の好きなフレームでイベントを発行させることができます。

「BP_I_battle_ai」を開きます。

関数を作成して名称を「from_anim」にします。
インプットを一つ追加して、Name型で名称を「Event」とします。

フォルダ「battle_ai」を開きます。

右クリック「ブループリント」から「AnimNotify」を選択して作成し、名称を「BP_AN_battle_ai」にします。

「BP_AN_battle_ai」を開きます。

関数のオーバーライドから「Received Notify」を選択します。

「Received Notify」を選択すると、下図の紫色の「Received Notify」と「Return Node」という二つのノードが作られます。

「Received Notify」に、下図のようにノードを追加します。

Name型変数「Event」を作成し、「インスタンス編集可能」にチェックをつけておきます。
「Get Owner」を追加して「Received Notify」の「Mesh comp」を入力にします。
「From Anim」を追加して、「Get Owner」と「get Event」を入力にします。

「weak_robot」フォルダ内に置いているアニメーション「Attack」を開きます。

最後のフレームを右クリック→通知を追加→先ほど作成した「BP_AN_battle_ai」を選択します。

「BP_AN_battle_ai」を選択した状態で、詳細パネルの変数「Event」に「end_attack」と記入します。

これでアニメーション「Attack」の最後に「BP_AN_battle_ai」が呼ばれ、「end_attack」というイベント名を入力としたインターフェース関数「From Anim」が呼ばれるようになります。

「BP_battle_ai」を開きます。

イベントグラフ上で「BP_I_battle_ai」の「Event From Anim」を追加します。
「Event」が「end_attack」と一致するか判定し、一致する場合「Set Attacking」(False)を接続します。

これで攻撃モーションのフレームの最後に「Attacking」フラグが下りて、攻撃モーションの再生を終えることができるようになります。

ここまで実装して、ゲームを実行すると、冒頭の動画のようにプレイヤーに追いついたAIキャラクターが攻撃モーション繰り返すようになります。

コメント

タイトルとURLをコピーしました