K.Y.さん、しんちょくどーですか?

仕事や趣味で知ったこと、つまずいたことを書いています

【UE4】UMGアニメーションの終了イベントが呼び出されるタイミングをまとめました

まえがき

UMGアニメーションで再生やら停止やらを使っているとアニメーション終了イベントがいつ呼び出されるのか混乱してきたので、迷わないためのメモです。

確認環境

アニメーション終了イベントが呼ばれるパターン

イベントが呼ばれる場面を挙げていきます。(「アニメーション終了イベント」だと長いので、以降は「イベント」と略します)

アニメーションが完了したとき

アニメーションを再生した後、アニメーションが最後まで走るとイベントが呼び出されます。そのままなのでわかりやすいですね。
アニメーションを再生させるノードはPlayAnimationノード、PlayAnimationTimeRangeノード、PlayAnimationForwardノード、PlayAnimationReverseノードがあります。

【+α】アニメーション再生中にもう一度同じアニメーションを再生した場合は?
最後に流したアニメーションが終了したときにイベントが一度だけ呼び出されます。先に流していたアニメーションはなかったことにされます。

アニメーションが停止したとき

アニメーションが停止するとイベントが呼び出されます。自分はこれが意外でした。意図せずイベントが呼び出されないよう気を付けないといけないですね。
アニメーションを停止させるノードはStopAnimationノード、StopAllAnimationsノード、StopAnimationsAndLatentActionsノードがあります。ほどんどの場合はStopAnimationノードを使う思います。

ちなみにアニメーションを停止した場合、アニメーション中に動かしていた値は0フレーム目の値に戻されます。停止時の値が保たれるわけではないので注意しましょう。

【+α】「通常再生 -> 一時停止 -> 停止」の場合はイベントが呼ばれる?
この場合でもイベントが呼び出されます。一度アニメーションを再生すると、途中で一時停止をしようが停止時にはイベントが呼ばれます。

【+α】アニメーション停止時にイベントを呼び出さない方法
アニメーション再生時にイベントを登録、アニメーション停止時にイベントの登録を解除というように自前でイベントの登録・解除を行うと可能です。
BindToAnimationFinishedノード(イベント登録)とUnbindFromAnimationFinishedノード(イベント解除)を使って↓のような感じで実装します。

アニメーション終了イベントが呼ばれないパターン

イベントが呼ばれない場面を挙げていきます。

無限ループ再生

アニメーションの終了がないので、イベントが呼び出されないです。
アニメーション再生時にNumLoopsToPlayを0に設定すると無限ループ再生になります。

再生速度0

アニメーションが進まないので、イベントが呼び出されないです。
アニメーション再生時にPlaybackSpeedを0.0に設定すると再生速度0になります。

アニメーション一時停止

アニメーションがその場で止まるので、イベントが呼び出されないです。
PauseAnimationノードを使うと一時停止になります。

アニメーションを再開したい場合は出力ピンのReturnValueをPlayAnimationノードのStartAtTimeにつなげます。(GetAnimationCurrentTimeで取得した時間をStartAtTimeにつなげる形でも良い)
このとき、再開したアニメーションが終了すればイベントが呼ばれます。

参考資料

あとがき

StopAnimationノードでアニメーションを停止した時にイベントが呼ばれることが意外だったため、これを忘れないよう記事にしました。 アニメーションを停止したつもりでも、イベントにつなげた処理が意図せず呼ばれてしまっていた...なんてことにならないために。(経験済み)