バーチャル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
おわりに
案外簡単にできて良かった。
アニメーションを遷移させられればゲームに動きを取り入れることができます。
また何かあれば追記します(*^_^*)





