かさたな日記

主にUnityを使った制作記録。書いてる人は初心者です。一緒に頑張ろう。

自分用Unityメモ:アニメーションの終了を待つ

AnimatorStateInfo を使用することで、
再生中のアニメーションの情報を得ることができます。
AnimatorStateInfo.Length でアニメーションの再生時間がわかるので
それを使ってモーション待ちが出来たりします。

//プロパティで読み取り専用にするよ
private bool m_isMotion;
public bool IsMotion{
    get{ return m_isMotion; }
}

//モーション開始と一緒に呼ぶコルーチン
IEnumerator AttackMotionCoroutine()
{
        //ホントはAnimatorは先に取得しておいた方が良いです
        Animator myAnimator = GetComponent<Animator>();
        m_isMotion = true;
      
            //遷移を待つ
            float transitionTime = 0;
            while (myAnimator.IsInTransition(0))
            {
                transitionTime += Time.deltaTime;
                yield return 0;
            }
            //念のためアニメーションのステートをUpdate
            //無いと遷移前ステートを取得しちゃうことがあります。。。
            myAnimator.Update(0);

            //モーション時間分だけ待つ
            AnimatorStateInfo stateInfo = myAnimator.GetCurrentAnimatorStateInfo(0);
            yield return new WaitForSeconds(stateInfo.length - transitionTime);
        
        m_isMotion = false;
    }

ただ、割と横着な方法なので
モーションごとにインターバル設定した方が
確実性はあると思います。。。