MRが楽しい

MRやVRについて学習したことを書き残す

キャラクターの速度に合わせてアニメーションの速度を変化させる

本日は Unity の小ネタ枠です。
キャラクターの速度に合わせてアニメーションの速度を変化させる方法を記事にします。
f:id:bluebirdofoz:20220404080027j:plain

サンプルシーンの作成

以下の歩きモーションを Entry アニメーションに設定したホロモンモデルを配置したサンプルシーンを作成しました。
f:id:bluebirdofoz:20220404080035j:plain
f:id:bluebirdofoz:20220404080043j:plain

この状態でシーンを再生するとホロモンがその場で通常速度の歩きモーションでアニメーションするのが確認できます。
f:id:bluebirdofoz:20220404080051j:plain

アニメーション速度の管理

歩きアニメーションの再生速度を動的に管理するため、調整用のパラメータを作成します。
アニメーションコントローラの[パラメータ]タブを開き、[+]ボタンで[Float]パラメータを追加します。
f:id:bluebirdofoz:20220404080124j:plain

今回はパラメータ名を[WalkSpeed]に設定しました。
f:id:bluebirdofoz:20220404080158j:plain

このパラメータと歩きモーションの再生速度を連動させます。
歩きモーションのステートを選択し、Inspector ビューを開きます。
f:id:bluebirdofoz:20220404080211j:plain

[Parameter]にチェックを入れ、[Multiplier]に先ほど作成した[WalkSpeed]パラメータを指定します。
これで歩きモーションの再生速度が[WalkSpeed]との乗算で反映されるようになりました。
f:id:bluebirdofoz:20220404080221j:plain

サンプルスクリプトの作成

実際にキャラクターの速度に応じて、スクリプトからアニメーションの速度を変更してみます。
以下の入力した数値に応じてキャラクターの速度とアニメーションの速度を変化させるサンプルスクリプトを作成しました。
・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);
    }
}

f:id:bluebirdofoz:20220404080236j:plain

キャラクターのオブジェクトにサンプルスクリプトと[Rigidbody]コンポーネントを追加して準備は完了です。
今回は水平移動で動作を確認するので[Rigidbody]の[UseGravity]はオフにしておきます。
f:id:bluebirdofoz:20220404080246j:plain

動作確認

シーンを再生して動作を確認します。
サンプルスクリプトの[Speed]フィールドの値を設定することで速度が変更できます。
f:id:bluebirdofoz:20220404080255j:plain

以下それぞれ速度を変更したときの変化です。
・速度:0.5 の場合
f:id:bluebirdofoz:20220404080806g:plain
・速度:2 の場合
f:id:bluebirdofoz:20220404081339g:plain

余談

実際には立ち止まっているとき、歩くとき、走るときではモーション自体が変わるのが自然です。
再生速度によるアニメーション調整は違和感のない一定の範囲でのみ利用し、敷居値を超えた場合は別のモーションに移行した方が見栄えが良くなります。
bluebirdofoz.hatenablog.com