バーチャル3Dクリエイター神部まゆみです(*^-^*)
この記事はUnityのAnimatorControllerをスクリプトで切り替えてみたので、それについての記事です。
この記事はAnystateで切り替える記事だけど、↓こちらのほうが簡単かも?
参考にした頭のいい先輩のページ
とても参考になりました。
ありがとうございます(*^-^*)




アニメーターで変数を使って制御する基礎知識
アニメーターで変数を定義しておくと、スクリプトから変数を使って制御できる。
アニメーターで使える変数は4種類
・Int : 整数
・Float : 小数
・Bool : bool値
・Trigger : bool値(遷移後戻る)
の4つのパラメーターがあるみたい。
5つのメソッドで変数を割り当てる
パラメーターは以下のメソッドで変数を割り当てる。
・SetFloat()
・SetInt()
・SetBool()
・SetTrigger()
・ResetTrigger()
スクリプトでアニメーションを制御する方法
スクリプトでアニメーションを制御できるようにしていきます。
左上の + を押してパラメーターを追加
アニメーター画面で、向かって左上の + を押せばパラメーターが追加できる。


↓これでTrigger変数のSpaceを追加できました。


Transision(遷移)を選択して、Condisionsにさっき作ったSpace変数を追加する
この矢印が遷移。遷移元のアニメーションで右クリック⇒遷移を作成で作れる。
この⇒を選択して、インスペクターのCondisitonにさっき作ったSpaceを追加する。


その後アニメーションを戻せるように矢印を双方向にする。


Conditionsっていうのは、unity公式サイトによると遷移の条件のこと。




スクリプトを適用して動かす
次に、あらかじめ作っておいたCubeに、スクリプトCubeを追加する。
using UnityEngine; using System.Collections; // CubeのAnimatorの制御 public class Cube : MonoBehaviour { Animator animator; // スタート時に呼ばれる void Start () { this.animator = GetComponent<Animator>(); } // フレーム毎に呼ばれる void Update () { if (Input.GetKeyDown("space")) { animator.SetTrigger("Space"); } } }
このCube.csをCubeにアタッチして、実行すればOK。
なんかエラー出てるとこあるけど、Spaceを押すとY軸回転とX軸回転のアニメーターが切り替わります。


AnimationEvent has no function…エラーは、アニメーションイベントを消せば消える
ちなみにこのエラーは AnimationEvent has no function… とか出てるけど、こちらの先輩によるとアニメーションイベントを削除するか、アニメーションイベントにファンクションを指定すると消えるみたい。

アニメーションイベントってなんだ?と思ったけど、アニメーションのキーの上にある青いヤツみたい。これをDeleteすればOK。


これでエラーが出なくなった!


Anystateを使えば、どんな状態からでも条件を満たせば遷移させられるらしい
Entryから伸びる遷移と違って、Anystateなら順番とか気にせずに、条件を満たしたら発動する感じっぽい。
試しにこんな感じにAnystateから伸ばしてみた。


上下左右のキーを押して、Anystateからアニメーションを切り替えるスクリプトを作った
int型の変数transを初期値0で作って、


各TransitionsのConditionsに条件を設定しておいて、


上下左右のキーが押されたらtransの値を書き換えるスクリプトを書いて、モデルにアタッチしておく。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class AnimChangeKey : MonoBehaviour { // Update is called once per frame void Update() { //GetComponentを用いてAnimatorコンポーネントを取り出す. Animator animator = GetComponent<Animator>(); //あらかじめ設定していたintパラメーター「trans」の値を取り出す. int trans = animator.GetInteger("trans"); //上矢印キーを押した際にパラメータ「trans」の値を0に if (Input.GetKeyDown(KeyCode.UpArrow)){ trans = 0; } //右矢印キーを押した際にパラメータ「trans」の値を1に if (Input.GetKeyDown(KeyCode.RightArrow)){ trans = 1; } //下矢印キーを押した際にパラメータ「trans」の値を2に if (Input.GetKeyDown(KeyCode.DownArrow)){ trans = 2; } //左矢印キーを押した際にパラメータ「trans」の値を3に if (Input.GetKeyDown(KeyCode.LeftArrow)){ trans = 3; } //intパラメーターの値を設定する. animator.SetInteger("trans", trans); } }
こうすることで、上下左右のキーを押せばtransの値が書き換わってTransitionの条件が満たされ、各アニメーションへの遷移が発動するようになる。
これで実行すると、上下左右のキーに対応したアニメーションをさせられるようになる。


変なテキストが表示されてるのは、テキスト表示の試行錯誤してた名残です(笑)。
ポーズはVeryAnimationっていう、MMDみたいにアニメーションが作れるアセットでサクッと作りました。
Very Animation|Unity Asset Store
おわりに
案外簡単にできて良かった。
アニメーションを遷移させられればゲームに動きを取り入れることができます。
また何かあれば追記します(*^_^*)