【Unity】Animatorでアニメーション(モーション)の速度をスクリプトで変える方法

モーションの速度をスクリプトで変える方法を勉強したので共有していきます。

以下の走るモーションを題材に解説したいと思います。

これをするには動的変更にはパラメータというものを使います。
それをモーションと紐づけて変化させていくという流れになります。

■開発環境

  • MacOS Monterey (12.1) Unity (2021.3.2f1)
  • 速度を参照するパラメータを作る

    [Paramaters]タブを開きます。

    +ボタンをクリックし Float を選択します。

    名称は後ほどスクリプトで参照するのでSpeedにしておきます。

    右側の数値に 0 が設定されていると思いますが、とりあえずこのままにしておきます。

    次はパラメータとモーションを紐づけてしていきます。

    走るモーションを選択しインスペクターを開きます。

    Speed欄の右にあるParamaterにチェックを入れます。

    プルダウンでで先ほど作成したSppedを選択します。

    これで紐付けが完了です。

    これで実行してみると・・・

    このようにモーションの1フレーム目で止まっています。

    これは速度が0になっているからです。

    パラメータの数値が0になっていたと思いますが、

    この値とインスペクターにあるモーションの速度を掛け算したものが最終的な速度になります。

    速度 = パラメータの数値 × モーションのSpeed

    どちらかが0ならモーションは進まないということですね。

    これでパラメータを変更すれば速度が変わるというのは理解できたと思います。

    スクリプトでパラメータを参照する

    Animatorクラスに対して以下のコードでパラメータにアクセスできます。

    _animator.SetFloat("パラメータ名",  "数値");
    

    ↑ですが、今回はFloatだったのでSetFloatですが、BoolならSetBoolIntなら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);
        }
    }
    

    こちらを実行すると・・・

    速度の上げ下げができてるのが分かると思います。

    これで任務完了!