Unity あのめんどくさいAnimatorのステートマシンから解放されよう
あいさつ
どうも、はかせです。
今日はJPHACKSの一日目でした。
私が参加しているチームはUnityを使って開発をしています。
そこで2日間という短期間でモノを作るということで
モーションは基本Animatorです。
ただUnityを少し触ったことがある方ならばわかるように
UnityのAnimatorはお世辞にも使いやすいとは言えません。
(少なくとも私はめんどくさくて嫌いです)
なのでそれをスクリプトから完全に管理するというやり方が
私含めたUnityのAnimator嫌いエンジニアにとって
一般的なやり方かと存じます。
(そうであってくれ)
ただ一般的なやり方であるゆえなのか
はたまた実はかなりニッチなのかはわかりませんが
そのやり方をのせている記事などがかなり少ないなという印象を受けました。
(説明するためのサンプル探すのに一手間かかった)
ということで今回はそのAnimatorをスクリプトから制御する
サンプルをのせていきたいと思います。
理屈はそんな難しいことでもないですので
説明自体はさらっと行きます。
サンプル
まずはAnimatorの設定を
こんな感じで初期ステートを適当に何も動かないステートに設定して置いて
AnyStateからは全てのAnimationへ矢印を伸ばします。
AnyStateってのはどのアニメーションからでも遷移できる的なやつです。
AnyStateから伸ばした矢印には条件として
Triggerを設定しておきます。
次はコードです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class UnityChanAnim : MonoBehaviour { private Animator anim; // Start is called before the first frame update void Start() { anim = GetComponent<Animator>(); } // Update is called once per frame void Update() { if (Input.GetKeyDown(KeyCode.J)) { SetAnimationTrigger("jump"); } if (Input.GetKeyDown(KeyCode.R)) { SetAnimationTrigger("run"); } if (Input.GetKeyDown(KeyCode.W)) { SetAnimationTrigger("walk"); } } public void SetAnimationTrigger(string animationTrigger) { anim.SetTrigger(animationTrigger); } }
変数名やクラス名は適宜変更してください。
凝ろうと思えばいくらでも凝れるんでしょうが、
私はAnimator如きに凝りたくないのでこんな感じの簡易的な
制御スクリプトをざらっと書くだけです。
やってることも単純で
AnimatorのSetTriggerメソッドを呼び出しているだけですね。
つまりやっていることは
・どのステートからでもTriggerでジャンプできるようAnimatorを設定する
・スクリプトから必要に応じてTriggerを設定してジャンプさせる
この二点だけです。
これをするだけでAnimatorのあのめんどくさいステートマシンから解放されます。
(GUIでやりたいならUE4のBPみたいに振り切ってくれりゃいいのにね)