(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



SimpleAnimationでアニメーション終了後に処理(コールバックの設定)【Unity】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2018.4.18f1


はじめに

Unityでアニメーションを再生したい場合、AnimatorControllerを作成してステートマシンを組んで……

みたいなやり方が一般的ですが、これがとにかく面倒くさいです。


f:id:kan_kikuchi:20180725095845j:plain


そんなステートマシンを使わずに昔のLegacy Animationみたく簡単にアニメーションが使える

SimpleAnimation(Unity公式から提供)という物を以前紹介しました。

f:id:kan_kikuchi:20180725094707g:plain


今回はそんなSimpleAnimationを使っている際に

「アニメーション終了時に処理をしたい!」みたいな場合の話。

イメージとしては以下のような感じ。

f:id:kan_kikuchi:20200320055522g:plain


なお、本記事に出てくる女の子のアセットは以下のものを使っています。

Sensei | 3D Humanoids | Unity Asset Store



SimpleAnimationでコールバック

SimpleAnimationにはいくつか再生用のメソッドがありますが、

どれもコールバックを指定出来ず、自前で終了判定を行う必要があります。


そしてその終了判定にはGetStateで取得できるStateのnormalizedTimeが使えます。

//normalizedTimeはどんなアニメで開始時が0、終了時が1
if (_simpleAnimation.GetState(_currentStateName).normalizedTime >= 1) {
//アニメーション終了
}


実際にコールバックを実行する流れは以下のような感じ。

  1. アニメ再生時にそのアニメの名前(stateName)を保持
  2. UpdateでstateNameのStateを取得し、normalizedTimeを確認
  3. normalizedTimeが1になったらコールバック実行


これだけだとちょっと分かりにくいかもしれないので、

具体例としてSimpleAnimationMonoBehaviourという物を作ってみました。



このSimpleAnimationMonoBehaviourをオブジェクトに追加し、

SimpleAnimationと再生したいAnimationClipを設定すると、

f:id:kan_kikuchi:20200320062529j:plain


以下のような感じでアニメーションの切り替えと同時にコールバックの指定できます。

[SerializeField]
private SimpleAnimationMonoBehaviour _simpleAnimationMonoBehaviour = null;
    
//Dieのアニメーション実行(ボタンを押すと実行
public void PlayDieAnimation(){
  Debug.Log("Dieアニメ開始");

  //0.1秒でDieBに切り替える。DieBのアニメーション終了後にログ表示
  _simpleAnimationMonoBehaviour.CrossFade("DieB", 0.1f, () => {
    Debug.Log("Dieアニメ終了");
  });
}
f:id:kan_kikuchi:20200320055522g:plain