モーションの速度をスクリプトで変える方法を勉強したので共有していきます。
以下の走るモーションを題材に解説したいと思います。
これをするには動的変更にはパラメータというものを使います。
それをモーションと紐づけて変化させていくという流れになります。
■開発環境
速度を参照するパラメータを作る
[Paramaters]タブを開きます。
+ボタンをクリックし Float
を選択します。
名称は後ほどスクリプトで参照するのでSpeed
にしておきます。
右側の数値に 0
が設定されていると思いますが、とりあえずこのままにしておきます。
次はパラメータとモーションを紐づけてしていきます。
走るモーションを選択しインスペクターを開きます。
Speed
欄の右にあるParamater
にチェックを入れます。
プルダウンでで先ほど作成したSpped
を選択します。
これで紐付けが完了です。
これで実行してみると・・・
このようにモーションの1フレーム目で止まっています。
これは速度が0になっているからです。
パラメータの数値が0になっていたと思いますが、
この値とインスペクターにあるモーションの速度を掛け算したものが最終的な速度になります。
速度 = パラメータの数値 × モーションのSpeed
どちらかが0ならモーションは進まないということですね。
これでパラメータを変更すれば速度が変わるというのは理解できたと思います。
スクリプトでパラメータを参照する
Animatorクラスに対して以下のコードでパラメータにアクセスできます。
_animator.SetFloat("パラメータ名", "数値");
↑ですが、今回はFloat
だったのでSetFloat
ですが、Bool
ならSetBool
、Int
ならSetInterger
といったデータ型ごとにメソッドが異なるので注意しましょう。
例として1キー押したらSppedを1にするコードを作ってみます
if (Input.GetKeyDown(KeyCode.Alpha1)) { Animator _animator = GetComponent<Animator>(); _animator.SetFloat("Speed", 1); }
これを実行してみると・・・
動的に速度を変更できましたね。
以上で完成です。
徐々に早く/遅くする
こっからおまけです。
SetFloat
はパラメータを指定の値に変更するというものですが、徐々に早くなるようにしたい時もあると思います。
しかしパラメータを相対的に変化させるAddFloat
のようなものはありません。そういう場合は自前で作るしかありません。
現在の数値を知るにはGetFloat
が使えます。それを踏まえて以下のような速度を変えるメソッドを作りました。
void AddSpeed(float val) { const float MinSpeed = 0.5f; const float MaxSpeed = 2.0f; Animator animator = GetComponent<Animator>(); // 現在値を取得 float power = animator.GetFloat("Speed"); // Clampで 0〜1に収まるようする power = Mathf.Clamp(power + val, MinSpeed, MaxSpeed); // それをセット animator.SetFloat("Speed", power); } // valに相対的な数値を入れます
それを呼び出すイベントを適当に用意します。
void Update() { // 左キー if (Input.GetKeyDown(KeyCode.LeftArrow)) { AddSpeed(-0.25f); } // 右キー if (Input.GetKeyDown(KeyCode.RightArrow)) { AddSpeed(0.25f); } }
こちらを実行すると・・・
速度の上げ下げができてるのが分かると思います。
これで任務完了!