バッテラが如く

プログラミングしましょ!

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

この記事の情報は次のバージョンで動作確認しています。

  • MacOS Monterey (12.1)
  • Unity (2021.3.2f1)
  • Unity

    はじめに

    どうも、バッテラです。

    モーションの速度をスクリプトで変える方法について共有します。以下の走るモーションを教材に解説していきます。

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

    速度を参照するパラメータを作る

    [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);
        }
    }
    

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

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

    これで任務完了!