UnityのAnimatorControllerをスクリプトで切り替える!Anystateからキー入力で切り替え

Unity

 

バーチャル3Dクリエイター神部まゆみです(*^-^*)

 

今日はunityのアニメーターをスクリプトで切り替える方法をやっていくよ。

キー入力を検知して、アニメーションを切り替えられるようにするよ。

最初に言っておくと私は詳しいわけではなく、調べながら探り探りやっていくところです。

その過程の備忘録みたいな感じなので、参考にできるところだけ参考にしてね。

■PR■

現在Meta Quest2 128GBが13%割引で買えるうえ、なんと「Space Pirate Trainer DX」と「GOLF+」がタダで貰えるようです(2023/04/02 23:59まで)。

ザッカーバーグ氏太っ腹すぎる…Σ(゚Д゚)

Meta Quest 2—完全ワイヤレスのVRヘッドセット【2023/06/03まで「Space Pirate Trainer DX」「GOLF+」無料ダウンロード付】—128GB|Amazon

この機会にメタバースデビューしておくのも良いかも。

参考にした頭のいい先輩のページ

とても参考になりました。

ありがとうございます(*^-^*)

UnityのAnimatorControllerの使い方|npaka|note
Unityの「AnimatorController」の使い方をまとめました。 1. AnimatorController 「AnimatorController」は、キャラクターやオブジェクトのアニメーションを管理するコントローラです。「AnimatorController」は、複数のアニメーションクリップを保持...

とても詳しく書かれているので、unityのアニメーターについて基礎から知りたい人は↑の先輩のページを見たほうが分かりやすいと思います( ̄▽ ̄;)

基本的なアニメーションを作る

こちらの頭のいい先輩のページを参考にしてやっていくね。

UnityのAnimatorControllerの使い方|npaka|note
Unityの「AnimatorController」の使い方をまとめました。 1. AnimatorController 「AnimatorController」は、キャラクターやオブジェクトのアニメーションを管理するコントローラです。「AnimatorController」は、複数のアニメーションクリップを保持...

 

アニメーター作成、アニメーション作成は基本的なところだから飛ばすけど、分からない人は↑のページを見てやってね。

↑の6.アニメーションパラメータ作成 からやります。

アニメーションパラメータとは?

アニメーターで定義して、スクリプトから読み出せる変数みたい。

私はここはやらずに遷移だけで動かしてたんだけど、それだとキー入力でアニメーションを切り替えたり、複雑な動きの切り替えができないみたい。

やっぱり変数を使ってコントロールできないとね。

アニメーターで使える変数は4種類

・Int : 整数
・Float : 小数
・Bool : bool値
・Trigger : bool値(遷移後戻る)

の4つのパラメーターがあるみたい。

Triggerっていうのは、遷移をするか判定するだけに使われて、引き金を引いたら元に戻ってまた使えるっていうニュアンスかな?

5つのメソッドで変数を割り当てる

パラメーターはアニメーター内の以下のメソッドで変数を割り当てるみたい。

・SetFloat()
・SetInt()
・SetBool()
・SetTrigger()
・ResetTrigger()

トリガーだけResetがあるけど、遷移後戻るんならいらないんじゃ?

と思ったけど、とりあえず進めてみます。

スクリプトでアニメーションを制御する

スクリプトでアニメーションを制御できるようにするよ。

先輩のページの 6.アニメーションパラメータ からやるよ。

UnityのAnimatorControllerの使い方|npaka|note
Unityの「AnimatorController」の使い方をまとめました。 1. AnimatorController 「AnimatorController」は、キャラクターやオブジェクトのアニメーションを管理するコントローラです。「AnimatorController」は、複数のアニメーションクリップを保持...

左上の + を押してパラメーターを追加

アニメーター画面で、向かって左上の + を押せばパラメーターが追加できるみたい。

これでTrigger変数のSpaceを追加したよ。

Transision(遷移)を選択して、Condisionsにさっき作った変数を追加する

次がちょっと分からない( ̄▽ ̄;)

(2) RotateY→RotateXのTransitionを選択し、InspectorウィンドウのConditionsに「Space」を追加。

Transitionってアニメーションのパラメーター?

アニメーションウィンドウでPositionとかRotationとかと一緒にあるパラメーター?

???

 

…あー分かった!Transitionって遷移のことか!日本語化してたから分からなかった( ̄▽ ̄;)

日本語化してると右クリックで「遷移の作成」って出るから、遷移としか認識してなかった。

この矢印のことね。これを選択して、インスペクターのCondisitonにさっき作ったSpaceを追加すればいいみたい。

condisitonにさっき作ったtrigger変数のSpaceを入れるみたい。

このCondisitionsは遷移の条件を指定する感じの機能だと思う。

 

次は、

(3) RotateX→RotateYのTransitionを追加し、InspectorウィンドウのConditionsに「Space」を追加。

また一瞬???ってなったけど、矢印を双方向的にすればいいみたい。

Transition(遷移)は、オレンジ色や灰色のボタンみたいなやつ(アニメーター)を右クリック → 遷移の作成 で作れるよ。日本語化してないとmake transitionとかかな?

 

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

でも何も設定してないけど大丈夫なのかな?

アニメーション遷移 - Unity マニュアル
アニメーション遷移 (Animation Transition) は、ステートマシン が、あるアニメーションステートから別のアニメーションステートへ切り替わったりブレンドしたりすることを可能にします。遷移は、複数のステート間のブレンドにかかる時間の長さを指定するだけでなく、どのような条件下でブレンドが始まるかを指定しま...

スクリプトを適用して動かす

次に、あらかじめ作っておいた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… とか出てるけど、こちらの先輩によるとアニメーションイベントを削除するか、アニメーションイベントにファンクションを指定すると消えるみたい。

【Unity】「AnimationEvent has no function name specified」のエラーを解決しました
Unityで「AnimationEvent has no function name specified」のエラーが発生したのですが、解決しました。

 

アニメーションイベントってなんだ?ってレベルなんだけど、これをDeleteすればいいみたい。

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

具体的にどんな動作をしているのか?

最初に this.animator = GetComponent<Animator>(); で、Cubeオブジェクト自身のアニメーターのコンポーネントを取得ってのはわかる。

でもこれでスペースを押すと切り替わるのが ? って感じ( ̄▽ ̄;)

if (Input.GetKeyDown("space")) 
{
     animator.SetTrigger("Space");
}

矢印のtransitionを見ても、trigger変数のSpaceを指定しただけだしなぁ…。

訳すと「もしスペースキーが押されたら、Trigger変数SpaceにSetTriggerするよ」ってことでしょ?

Triggerって要はBool値だから、0を1にするってことかな。

多分これって、boolで値が0か1しかないから、Trigger変数の場合は「==1だったら(真だったら)」っていう記述が省略されてるだけってことかな?

int変数あったら複数のパターンを指定する必要があるかもしれないけど、boolだと1か0の2パターンしかないから、わざわざ記述するまでもないみたいな。

 

unity公式サイトによると、「遷移によって消費されたときリセットされる」って書いてあるから、遷移したらデフォルト値に戻るんだよね。

アニメーションパラメーター - Unity マニュアル
アニメーションパラメーターは Animator Controller 内で定義され、スクリプトからアクセスしたり値を割り当てることができる変数です。スクリプトをどのように制御するか、もしくはどのようにステートマシンの一連の流れに作用するかを定義します。

スペースキーを押すとTrigger変数Spaceが真(1)になって遷移が発生、遷移後はTriggerだから負(0)にリセットされる、その後またスペースキーを押すとまた…っていう意味かな。多分。

ConditionsにTrigger変数を指定した場合、Settriggerするだけで遷移が発生して、遷移発生後はTrigger変数の仕様でリセットされるってことか。

C言語とかで通常のboolなら使ってたけど、triggerなんて初めて使ったよ。

でもこれだと押すか押さないかしか判定できないから、私の場合はもっと複数のキーを設定して複雑にコントロールしたいところだね。

 

あーでも、どう動かしたいかによるのか。

1つのアニメーションからどう推移していくか次第だと思う。

アニメーション1からアニメーション2に推移させていくだけなら、このサンプルだけで十分。

でも複数選んで分岐させていったり、一定時間経ったりして初期状態にリセットして、スタート地点からは複数のアニメーションに分岐させられるようにしておくのであれば、intで複数の選択肢を選べるようにキー設定しておかないといけない。

Anystateを使えば、どんな状態からでも条件を満たせば遷移させられるらしい

Entryから伸びる遷移と違って、Anystateなら順番とか気にせずに、条件を満たしたら発動する感じっぽい?

試しにこんな感じにAnystateから伸ばしてみた。

こちらの頭のいい先輩のページを参考にして、キー入力でうまい具合に遷移していくようなスクリプトを組んでみます。

【Unity】Animator Controllerを用いたアニメーション切り替え方法 – XR-Hub
以前の記事でアニメーションクリップを用いた簡易的なアニメーション表現についてご紹介しました。 *先に以下の記事を読んでいただけると幸いです。 【Unity】アニメーションクリップを用いてオブ...

上下左右のキーを押して、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

 

anystateを使う場合に不具合が出たら、このページが参考になりそう?

後でこのあたりで詰まりそうな気がするから一応メモがてら貼っておきます。

【Unity】AnimationControllerのAnyStateを使用してる際、現在のStateへ何度も移動しないようにする - テラシュールブログ
今回は小さなTipsです。 例えば上のように「どれか一つのUI状態を持つ」UIをAnimationControllerで管理し、かつAnyStateから呼び出すように作成した際、Triggerを叩くと何度もUI表示アニメーションが再生されてしまうといった事があります。 AnyStateの先へは何処からでも行ける 下Gi...

 

タイトルとURLをコピーしました