MRが楽しい

MRやVRについて学習したことを書き残す

Unityで基本変形(移動・回転・スケール)のアニメーションを作成する その7(アニメーションの終了を検知する)

本日は Unity の技術調査枠です。
基本変形(移動・回転・スケール)のアニメーションを作成する方法についてまとめます。
今回はアニメーションの終了を検知する方法です。

前回記事

以下の記事の続きになります。
bluebirdofoz.hatenablog.com

アニメーションの終了を検知する

前回作成した[Loop Time]を無効化したアニメーションコントローラを利用します。

アニメーションの終了を検知するには normalizedTime を利用します。
normalizedTime は 0 から始まり、アニメーションの再生がすべて完了すると 1 になります。
State が変わらないままアニメーションがループする場合は 1 から更に加算されていきます。
docs.unity3d.com

スクリプトを修正してアニメーションを再生したときにその状態をログ出力するようにしました。
・AnimationKicker.cs

using UnityEngine;

[RequireComponent(typeof(Animator))] 
public class KickTrigger : MonoBehaviour {
    /// <summary>
    /// Animatorコンポーネント
    /// </summary>
    [SerializeField]
    private Animator animator;
    
    /// <summary>
    /// 待機状態ID
    /// </summary>
    int waitSateHash = Animator.StringToHash("Base Layer.WaitState");

    /// <summary>
    /// 参照の設定
    /// </summary>
    void Reset () {
        // Animatorコンポーネントの取得
        animator = GetComponent<Animator>();
    }

    /// <summary>
    /// 定期実行
    /// </summary>
    void Update()
    {
        // Zキー押下で実行する
        if (Input.GetKey(KeyCode.Z))
        {
            // トリガーを実行する
            animator.SetTrigger("AnimTrigger");
        }

        if (animator.GetCurrentAnimatorStateInfo(0).fullPathHash != waitSateHash)
        {
            if (animator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f)
            {
                Debug.Log("アニメーション再生中");
            }
            else
            {
                Debug.Log("アニメーション終了");
            }
        }
    }
}

動作確認

シーンを再生してZキーを押下し、アニメーションを開始します。

以下の通りアニメーション再生中と終了のタイミングでログが切り替わりました。