この記事でのバージョン
Unity 2018.4.18f1
はじめに
Unityでアニメーションを再生したい場合、AnimatorControllerを作成してステートマシンを組んで……
みたいなやり方が一般的ですが、これがとにかく面倒くさいです。
そんなステートマシンを使わずに昔のLegacy Animationみたく簡単にアニメーションが使える
SimpleAnimation(Unity公式から提供)という物を以前紹介しました。
今回はそんなSimpleAnimationを使っている際に
「アニメーション終了時に処理をしたい!」みたいな場合の話。
イメージとしては以下のような感じ。
なお、本記事に出てくる女の子のアセットは以下のものを使っています。
Sensei | 3D Humanoids | Unity Asset Store |
SimpleAnimationでコールバック
SimpleAnimationにはいくつか再生用のメソッドがありますが、
どれもコールバックを指定出来ず、自前で終了判定を行う必要があります。
そしてその終了判定にはGetStateで取得できるStateのnormalizedTimeが使えます。
//normalizedTimeはどんなアニメで開始時が0、終了時が1 if (_simpleAnimation.GetState(_currentStateName).normalizedTime >= 1) { //アニメーション終了 }
実際にコールバックを実行する流れは以下のような感じ。
- アニメ再生時にそのアニメの名前(stateName)を保持
- UpdateでstateNameのStateを取得し、normalizedTimeを確認
- normalizedTimeが1になったらコールバック実行
これだけだとちょっと分かりにくいかもしれないので、
具体例としてSimpleAnimationMonoBehaviourという物を作ってみました。
このSimpleAnimationMonoBehaviourをオブジェクトに追加し、
SimpleAnimationと再生したいAnimationClipを設定すると、
以下のような感じでアニメーションの切り替えと同時にコールバックの指定できます。
[SerializeField] private SimpleAnimationMonoBehaviour _simpleAnimationMonoBehaviour = null; //Dieのアニメーション実行(ボタンを押すと実行 public void PlayDieAnimation(){ Debug.Log("Dieアニメ開始"); //0.1秒でDieBに切り替える。DieBのアニメーション終了後にログ表示 _simpleAnimationMonoBehaviour.CrossFade("DieB", 0.1f, () => { Debug.Log("Dieアニメ終了"); }); }