MRが楽しい

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

Unityで基本変形(移動・回転・スケール)のアニメーションを作成する その7(全ての状態から割り込みでアニメーションを切り替える)

本日は Unity の技術調査枠です。
基本変形(移動・回転・スケール)のアニメーションを作成する方法についてまとめます。
今回は全ての状態から割り込みでアニメーションを切り替える方法です。

前回記事

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

様々なアニメーションに遷移させる

前回作成した State を遷移するアニメーションコントローラの遷移先を増やします。
それぞれ上下左右移動のアニメーションを作成して State に設定を行いました。

合わせてスクリプトを以下の通り修正して、WASDキーに合わせてCubeが移動するようにしました。

using UnityEngine;

[RequireComponent(typeof(Animator))] 
public class MoveTrigger : MonoBehaviour {
    /// <summary>
    /// Animatorコンポーネント
    /// </summary>
    [SerializeField]
    private Animator animator;

    private static readonly int UpTrigger = Animator.StringToHash("UpTrigger");
    private static readonly int DownTrigger = Animator.StringToHash("DownTrigger");
    private static readonly int RightTrigger = Animator.StringToHash("RightTrigger");
    private static readonly int LeftTrigger = Animator.StringToHash("LeftTrigger");

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

    /// <summary>
    /// 定期実行
    /// </summary>
    void Update()
    {
        // Wキー押下で実行する
        if (Input.GetKey(KeyCode.W))
        {
            // トリガーを実行する
            animator.SetTrigger(UpTrigger);
        }
        // Sキー押下で実行する
        if (Input.GetKey(KeyCode.S))
        {
            // トリガーを実行する
            animator.SetTrigger(DownTrigger);
        }
        // Aキー押下で実行する
        if (Input.GetKey(KeyCode.A))
        {
            // トリガーを実行する
            animator.SetTrigger(LeftTrigger);
        }
        // Dキー押下で実行する
        if (Input.GetKey(KeyCode.D))
        {
            // トリガーを実行する
            animator.SetTrigger(RightTrigger);
        }
    }
}

この状態でシーンを再生して動作確認してみます。
WASDキーの入力に応じてCubeが移動しますが、アニメーションが終了するまで次のアニメーションの割り込みはできません。

これはWaitStateからのみ遷移が設定されているためです。

割り込みでアニメーションを切り替える

アニメーションを割り込ませるには全ての状態で各 State への遷移を設定する必要があります。
このとき、AnyState を利用すると便利です。AnyState はあらゆる状態からの遷移を設定できます。
docs.unity3d.com

以下の通り、各 State への遷移を AnyState からに変更しました。

この状態でシーンを再生して動作確認してみます。
WASDキーの入力に応じてアニメーションが即座に切り替わり、Cubeが移動するようになりました。