【Unity】AnimatorのTriggerについて理解する
UnityのアニメーションパラメータにはBoolとTriggerがあります。
どちらもフラグ管理用のパラメータです。
恥ずかしながら、今までアニメーションをしっかり触ったことがなく
つい最近までこの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になります。
スクリプトドキュメントでも書かれている通り、ジャンプや攻撃など、
一回使い切りのアニメーションで使えそうです。
一方boolの方は、スクリプト側からtrue/falseを操作することになります。
崖から落ちているときのモーションや、死んだときなど、
常にそのアニメーションにして欲しい時に使うイメージですね。
図にするとこんなイメージです。
Animation.ResetTrigger()について
TriggerをOffにする関数も用意されています。
例として、長い呪文の詠唱モーション中にダメージを受けたときに、
詠唱モーションをキャンセルしたいときに使えそうです。
参考にしたもの
・アニメーション遷移 - Unity マニュアル
・アニメーションパラメーター - Unity マニュアル
・Unity - Scripting API: Animator.SetBool
・Unity - Scripting API: Animator.SetTrigger
・Unity - Scripting API: Animator.ResetTrigger