本日は 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