本日は Unity の小ネタ枠です。
キャラクターの速度に合わせてアニメーションの速度を変化させる方法を記事にします。
サンプルシーンの作成
以下の歩きモーションを Entry アニメーションに設定したホロモンモデルを配置したサンプルシーンを作成しました。
この状態でシーンを再生するとホロモンがその場で通常速度の歩きモーションでアニメーションするのが確認できます。
アニメーション速度の管理
歩きアニメーションの再生速度を動的に管理するため、調整用のパラメータを作成します。
アニメーションコントローラの[パラメータ]タブを開き、[+]ボタンで[Float]パラメータを追加します。
今回はパラメータ名を[WalkSpeed]に設定しました。
このパラメータと歩きモーションの再生速度を連動させます。
歩きモーションのステートを選択し、Inspector ビューを開きます。
[Parameter]にチェックを入れ、[Multiplier]に先ほど作成した[WalkSpeed]パラメータを指定します。
これで歩きモーションの再生速度が[WalkSpeed]との乗算で反映されるようになりました。
サンプルスクリプトの作成
実際にキャラクターの速度に応じて、スクリプトからアニメーションの速度を変更してみます。
以下の入力した数値に応じてキャラクターの速度とアニメーションの速度を変化させるサンプルスクリプトを作成しました。
・WalkAnimationController.cs
using UnityEngine; [RequireComponent(typeof(Animator))] [RequireComponent(typeof(Rigidbody))] public class WalkAnimationController : MonoBehaviour { /// <summary> /// モデルの移動速度 /// </summary> public float Speed; /// <summary> /// アニメーションコンポーネント /// </summary> private Animator p_Animator; /// <summary> /// 慣性コンポーネント /// </summary> private Rigidbody p_Rigidbody; /// <summary> /// アニメーションの歩き速度の調整パラメータ名 /// </summary> private const string ps_WalkSpeed = "WalkSpeed"; void Start() { // アニメーターの参照を取得する p_Animator = this.GetComponent<Animator>(); // 慣性の参照を取得する p_Rigidbody = this.GetComponent<Rigidbody>(); } void Update() { // Inspector で入力された値に応じてオブジェクトの速度を設定する p_Rigidbody.velocity = new Vector3(0.0f, 0.0f, Speed); // オブジェクトの速度を元にアニメーションの速度を決定する // (係数は速度とアニメーションが自然に一致して見える数値に調整する) float walkSpeed = p_Rigidbody.velocity.magnitude * 3.0f; // アニメーションの速度を[WalkSpeed]パラメータに設定する p_Animator.SetFloat(ps_WalkSpeed, walkSpeed); } }
キャラクターのオブジェクトにサンプルスクリプトと[Rigidbody]コンポーネントを追加して準備は完了です。
今回は水平移動で動作を確認するので[Rigidbody]の[UseGravity]はオフにしておきます。
動作確認
シーンを再生して動作を確認します。
サンプルスクリプトの[Speed]フィールドの値を設定することで速度が変更できます。
以下それぞれ速度を変更したときの変化です。
・速度:0.5 の場合
・速度:2 の場合
余談
実際には立ち止まっているとき、歩くとき、走るときではモーション自体が変わるのが自然です。
再生速度によるアニメーション調整は違和感のない一定の範囲でのみ利用し、敷居値を超えた場合は別のモーションに移行した方が見栄えが良くなります。
bluebirdofoz.hatenablog.com