みなさんこんにちは。トイロジックでは主にインゲームを担当しています、プログラマのMです。ゲーム制作をしていると「アニメーションに紐づいた何かしらのイベントを呼び出したい」という要望がでてきます。具体的な例だと「エフェクトを出したい」「SEを鳴らしたい」「専用のカメラに切り替えたい」などなど、いろいろ考えられます。

今回は、Unreal Engine 4(以降、UE4)の開発環境でどうやって実現するのか? その一例をご紹介できればと思います。本記事では、UE4.27.2 (日本語)の ThirdPerson(Blueprintプロジェクト)プロジェクトを元に解説していきます。すべてUE4エディタ上での作業となり、最低限UE4の知識が必要となりますので、ご了承ください。

具体的な目標

ThirdPersonプロジェクトを作成したままの状態だと、グレイマンのジャンプアクションにおいてアニメーションとジャンプタイミングがズレていることが気になります。

漠然と解説を行うのも面白くないので、今回はこのジャンプアクションを実際に改修してみようと思います。目標は「アニメーション(モーション)の特定のタイミングでジャンプするように調整できるようにする」です。

アニメーションにジャンプタイミングを設定

まずは、アニメーションに通知(AnimNotify)を設定します。ThirdPersonJump_Startアセットを開き、通知欄を右クリック > 通知を追加 > 新規通知 の順番で選択し、新規で作成した通知の名前を「JumpUp」とします。作成した通知のタイミングを、いい感じのジャンプ開始位置(地面から足が離れていそうなところ)に設定しておきます。

アニメーションブループリントの改修

イベントの作成

最初に、Boolean型の変数を追加します。これはジャンプした(≒ジャンプに対応したキーが押された)かどうかの判定用の変数で、この後追加するイベントにて使用します。変数名は「IsJumped?」とします。

次に、イベントグラフ上で2つのイベントを追加します。1つ目に、キャラクターのジャンプに対応したキーが押された際のイベントを作成します。イベントグラフ > 右クリック > イベントを追加 > カスタムイベントを追加 の順で選択し、新規で作成したイベント名を、「Event_JumpStart」とします。このイベントの構成自体は簡単で、先ほど作成した「IsJumped?」のSet関数を呼び出し、Trueにするだけです。

2つ目に、先ほどThirdPersonJump_Startアセットに仕込んだ「JumpUp」イベントの受け取り口を作成します。イベントグラフ > 右クリック > アニム通知イベントを追加 > AnimNotify_JumpUp の順で選択します。「IsJumped?」をFalseにし、ThirdPersonCharacterのJump関数を呼び出します。

 

トランジション(状態遷移)ルールを変更

次に、トランジション(状態遷移)ルールを変更します。1つ目に、待機(走り)状態 から ジャンプ開始時のトランジションルールです。AnimGraph > Default > Idle/RunからJumpStartへのトランジションルール を開き、「IsJumped?」を監視するように変更します。

2つ目に、ジャンプ開始時 から ジャンプ中 のトランジションルールです。AnimGraph > Default > JumpStartからJumpLoopへのトランジションルール を開き、「IsinAir?」を監視するように変更します。

キャラクターブループリントの改修

最後に、ThirdPersonCharacterアセットを改修していきます。ジャンプに関連したInputイベント「インプットアクション Jump」の Pressed から先を変更します。ThirdPersonCharacter自身が地面にいるか判定し、地面にいる場合のみ、ThirdPerson_AnimBPアセットに作成し「Event_JumpStart」を呼び出すようにします。

結果

ここまで作業を終了です、実行して動作確認をしてみましょう。

初期状態と比べて、改善されているのがわかるかと思います。手元で本記事の環境を構築された方は、ThirdPersonJump_Startアセットに設定した「JumpUp」通知の位置をわざと後方にしてみると、よりわかりやすくなるかと思います。

この手法であれば、アニメーションに変更が入ってジャンプタイミングが変わった際にも「JumpUp」通知の位置を調整するだけで対応できます。

最後に

本記事では、新規でイベントを作成し、AnimNotifyを使用することで、目標を実現しました。イベントを受け取ったあとの処理内容を変更することで、さまざまな要望に対応できるかと思います。

ただし、本記事の実装内容はあくまでも一例であり、実現方法はまだまだあるかと思います。ぜひ、みなさんが作っているゲームに適した方法で、実現していただければと思います。それでは!

著者紹介 M
2010年に新卒でプログラマとしてゲーム業界入りし、多ジャンルのゲーム開発に参加。2019年にトイロジックへ中途入社後は、アクションゲームのキャラクター制御関連を担当。大作からインディーまで、幅広く遊ぶ雑食ゲーマー。