【Unity】AnimatorのTriggerについて理解する

UnityのアニメーションパラメータにはBoolTriggerがあります。
どちらもフラグ管理用のパラメータです。

恥ずかしながら、今までアニメーションをしっかり触ったことがなく
つい最近までこの2つのパラメータの違いがよく分かりませんでした。

なので、完全理解をして今後に生かそうとする記事です。

結論

先に結論を書きます。

AnimatorのTriggerのフラグは
指定のアニメーションステートへ推移した瞬間にOffになります。

Unlike bools which have the same true/false option, Triggers have a true option which automatically returns back to false. A typical example might be to have a Jump option.

Animator-SetTrigger - Unity スクリプトリファレンス

事前準備

Idle(待機)アニメーションとJump(Jump)アニメーションを作り、
各アニメーションクリップをアニメーションウィンドウで推移できる状態にしておきます。

なお、Idle状態のアニメーションクリップはループ
Jump状態のアニメーションクリップはループさせないようにしておきます。

Animation.SetBool()

アニメーションウィンドウでは、
IdleからJumpへの推移条件は「"Bool"がtrueの時」

JumpからIdleへの推移条件は「"Bool"がfalseの時」にしておきます。

ソースコードでは、
左クリックを押すと"Bool"をtrueにするように組んでおきます。
docs.unity3d.com

using UnityEngine;

public class AnimationTest: MonoBehaviour
{
    //-----------------------------------------------------------------------
    // メンバ変数
    //-----------------------------------------------------------------------

    // アニメーター
    private Animator m_Animator = null;

    //-----------------------------------------------------------------------
    // Unityメゾット
    //-----------------------------------------------------------------------

    // 初期化処理
    private void Start()
    {
        m_Animator = GetComponent<Animator>();
    }

    // 更新処理
    private void Update()
    {
        // 左クリック
        if (Input.GetMouseButtonDown(0))
        {
            m_Animator.SetBool("Bool", true);
            Debug.Log("左クリック");
        }
    }
}

Unityに戻り再生し、左クリックを押してみます。

無限にJumpモーションを繰り返しています。

再生が終わった後ExitStateに行きますが、
"Bool"がtrueのままなので、
Entryに戻った後即座にJumpモーションに入っている挙動
です。

Animation.SetTrigger()

アニメーションウィンドウでは、
IdleからJumpへの推移条件は「"Trigger"がOnになった時」にしておきます。

TriggerがOffになった時の推移条件はないので、
JumpからIdleに戻る処理は何もありません。

ソースコードでは、
左クリックを押すとTriggerをOnにするように組んでおきます。
docs.unity3d.com

using UnityEngine;

public class AnimationTest: MonoBehaviour
{
    //-----------------------------------------------------------------------
    // メンバ変数
    //-----------------------------------------------------------------------

    // アニメーター
    private Animator m_Animator = null;

    //-----------------------------------------------------------------------
    // Unityメゾット
    //-----------------------------------------------------------------------

    // 初期化処理
    private void Start()
    {
        m_Animator = GetComponent<Animator>();
    }

    // 更新処理
    private void Update()
    {
        // 左クリック
        if (Input.GetMouseButtonDown(0))
        {
            m_Animator.SetTrigger("Trigger");
            Debug.Log("左クリック");
        }
    }
}

Unityに戻り再生し、左クリックを押してみます。

少しわかりづらいですが、Jumpアニメーションステートに推移した瞬間に
自動的にTriggerがOffになっています。

ゆる解説

先ほど記述しましたが、Triggerは指定のアニメーションが推移した時に、
自動的にTriggerがOffになります。

スクリプトドキュメントでも書かれている通り、ジャンプや攻撃など、
一回使い切りのアニメーションで使えそうです。

docs.unity3d.com

一方boolの方は、スクリプト側からtrue/falseを操作することになります。
崖から落ちているときのモーションや、死んだときなど、
常にそのアニメーションにして欲しい時に使うイメージですね。

docs.unity3d.com

図にするとこんなイメージです。

Animation.ResetTrigger()について

TriggerをOffにする関数も用意されています。

docs.unity3d.com

例として、長い呪文の詠唱モーション中にダメージを受けたときに、
詠唱モーションをキャンセルしたいときに使えそうです。

参考にしたもの

アニメーション遷移 - Unity マニュアル
アニメーションパラメーター - Unity マニュアル
Unity - Scripting API: Animator.SetBool
Unity - Scripting API: Animator.SetTrigger
Unity - Scripting API: Animator.ResetTrigger