はかせのラボ

私の頭の中を書いていく雑記ブログです

Unity あのめんどくさいAnimatorのステートマシンから解放されよう

あいさつ

どうも、はかせです。

今日はJPHACKSの一日目でした。
私が参加しているチームはUnityを使って開発をしています。
そこで2日間という短期間でモノを作るということで
モーションは基本Animatorです。

ただUnityを少し触ったことがある方ならばわかるように
UnityのAnimatorはお世辞にも使いやすいとは言えません。
(少なくとも私はめんどくさくて嫌いです)

なのでそれをスクリプトから完全に管理するというやり方が
私含めたUnityのAnimator嫌いエンジニアにとって
一般的なやり方かと存じます。
(そうであってくれ)

ただ一般的なやり方であるゆえなのか
はたまた実はかなりニッチなのかはわかりませんが
そのやり方をのせている記事などがかなり少ないなという印象を受けました。
(説明するためのサンプル探すのに一手間かかった)

ということで今回はそのAnimatorをスクリプトから制御する
サンプルをのせていきたいと思います。

理屈はそんな難しいことでもないですので
説明自体はさらっと行きます。

サンプル

まずはAnimatorの設定を
f:id:hakase0274:20191026224533p:plain
こんな感じで初期ステートを適当に何も動かないステートに設定して置いて
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みたいに振り切ってくれりゃいいのにね)

あとがき

今回はUnityのAnimatorを簡単に扱うためのスクリプトサンプルの話でした。

本当にこの記事にあげたことだけで
UnityのAnimatorのめんどくささが激減するので
一度試してみてください。

まぁここまで来たら一週回って
レガシーAnimationのがいいんじゃないのかとか
思わなくもないですが、
ノードベースかつステートでAnimationを管理できるってのは利点がある
・・と思いますw
(動きは全部スクリプトでパワープレイするマンなのでわかりかねます・・・)

今回の記事が良ければスターやコメント等よろしくお願いします。
それでは今回はこの辺でノシ