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キャラクターが攻撃モーション繰り返すようになります。
コメント