Unityでアニメーションクリップを切り替えるスクリプトを書いた。速度も変更できる

アニメーションクリップ 切り替え Unity
※記事内に広告が含まれています。

バーチャル3Dクリエイター神部まゆみです(*^_^*)

この記事はUnityでアニメーションクリップを切り替えるスクリプトを書いたので、それについての記事です。

以前も似たようなスクリプトを書いたけど、この記事のやつのほうが簡単で機能が多いかな。

動作確認した最新のバージョンはUnity 6000.0.32です。

●PRスペース●
■PR■

現在、3D自然環境系アセットが50%オフで買える Unityパブリッシャーセール をやってるみたいです(2025/09/25 23:59まで)。

Unity パブリッシャーセール 50%オフ

クーポンコード JASONBOOTH を使うと、↓3D自然環境を手軽に作れるMicro Verseアセットがタダで貰えます(決済時にクーポンコード入力適用で0円に)。

unity MicroVerse asset

無料アセットだけでも貰っておくと良いかも。

〇まゆみマート|BOOTH

BOOTHでVRoidテクスチャやVRChat向けオブジェクトなどを販売しています。いいねしてくれると励みになります(*^-^*)

事前準備:アニメーションを用意してモデルに登録しておく

まずアニメーションを用意してモデルに登録しておく。

Mixamoで落としたアニメーションを使いました。

アニメーションクリップを名前で指定して切り替えるスクリプト AnimationSwitcher.cs

これはアニメーション名を手動で指定する必要がありますが、単純なので導入はラク。

デフォルトでは最大5つのアニメーションを登録できますが、

if (Input.GetKeyDown(KeyCode.Alpha5)) PlayAnimation(4);

以降にキーを割り当てて追加していけばそれ以上増やせます。

using UnityEngine;

public class AnimationSwitcher : MonoBehaviour
{
    public Animator animator;  // Animatorコンポーネント
    public string[] animationNames; // アニメーションのState名(最大5つ)
    public float transitionDuration = 0.2f; // 遷移時間

    public float[] speedLevels = { 0.5f, 1.0f, 2.0f }; // 3段階のアニメーションスピード
    private int currentSpeedIndex = 1; // デフォルトは1.0倍

    private string currentAnimation = ""; // 現在のアニメーション名

    void Update()
    {
        // アニメーションの切り替え
        if (Input.GetKeyDown(KeyCode.Alpha1)) PlayAnimation(0);
        if (Input.GetKeyDown(KeyCode.Alpha2)) PlayAnimation(1);
        if (Input.GetKeyDown(KeyCode.Alpha3)) PlayAnimation(2);
        if (Input.GetKeyDown(KeyCode.Alpha4)) PlayAnimation(3);
        if (Input.GetKeyDown(KeyCode.Alpha5)) PlayAnimation(4);

        // スピード変更
        if (Input.GetKeyDown(KeyCode.Q)) ChangeSpeed(-1); // 遅くする
        if (Input.GetKeyDown(KeyCode.E)) ChangeSpeed(1);  // 速くする
        if (Input.GetKeyDown(KeyCode.R)) ResetSpeed();    // 通常速度に戻す
    }

    void PlayAnimation(int index)
    {
        if (index < 0 || index >= animationNames.Length) return;

        string animName = animationNames[index];

        // 現在のアニメーションと同じなら何もしない
        if (animator.GetCurrentAnimatorStateInfo(0).IsName(animName)) return;

        // アニメーション切り替え
        animator.CrossFade(animName, transitionDuration);
        currentAnimation = animName;
    }

    void ChangeSpeed(int change)
    {
        currentSpeedIndex += change;
        currentSpeedIndex = Mathf.Clamp(currentSpeedIndex, 0, speedLevels.Length - 1);

        animator.speed = speedLevels[currentSpeedIndex];
        Debug.Log($"Animation Speed: {animator.speed}");
    }

    void ResetSpeed()
    {
        currentSpeedIndex = 1; // 1.0倍にリセット
        animator.speed = speedLevels[currentSpeedIndex];
        Debug.Log("Animation Speed Reset to Normal (1.0x)");
    }
}

12345キーにアニメーションクリップを割り当て、Qで遅くなりEで早くなりRで通常速度に戻ります。

使い方:スクリプトをモデルに追加、手動でアニメーターとアニメーションを追加する

遷移間隔も指定できるようにしてあります。

アニメーションクリップ 切り替え

プルダウン式にアニメーションを選択するシステムにしようかと思ったけど、カスタムエディタとかいうの使わないといけないらしくてやめた(^_^;)まぁこれでも動くからいいか。

これで切り替えられます!

ブレンドシェイプ切り替えスクリプトと組み合わせてみる

以前書いたブレンドシェイプ切り替えスクリプトと組み合わせてみます。

しかしキーコードが被っているので別のキーに割り当てた方が良いかも。

KeyCode - Unity スクリプトリファレンス
Key codes returned by Event.keyCode. These map directly to a physical key on the keyboard. If "Use Physical Keys" is ena...

とりあえずAとSに切り替えてみた。

using UnityEngine;

public class VRMExpressionController : MonoBehaviour
{
    [SerializeField] private SkinnedMeshRenderer faceMeshRenderer; // Faceメッシュ
    [SerializeField] private string[] blendShapeNames;             // ブレンドシェイプ名のリスト

    private void Update()
    {
        // キー入力で表情を切り替え
        if (Input.GetKeyDown(KeyCode.A)) // "A"キーで表情1
        {
            SetExpression(blendShapeNames[0]);
            Debug.LogWarning("Aキーが押されました");
        }
        else if (Input.GetKeyDown(KeyCode.S)) // "S"キーで表情2
        {
            SetExpression(blendShapeNames[1]);
            Debug.LogWarning("Sキーが押されました");
        }
        // 必要に応じて他のキーも設定
    }

    private void SetExpression(string blendShapeName)
    {
        // すべてのブレンドシェイプをリセット
        for (int i = 0; i < faceMeshRenderer.sharedMesh.blendShapeCount; i++)
        {
            faceMeshRenderer.SetBlendShapeWeight(i, 0f);
        }

        // 指定したブレンドシェイプを適用
        int index = faceMeshRenderer.sharedMesh.GetBlendShapeIndex(blendShapeName);
        if (index >= 0)
        {
            faceMeshRenderer.SetBlendShapeWeight(index, 100f); // 値を100に設定(調整可能)
        }
        else
        {
            Debug.LogWarning($"ブレンドシェイプ '{blendShapeName}' が見つかりません。");
        }
    }
}

まぁこんな感じ。スキンメッシュレンダラーがあるオブジェクトならFace以外でも指定できるようになっているから、仕込んだオブジェクトを表示させたりすると応用の幅が広がるかな?

マテリアル切り替えスクリプトも

赤面テクスチャとかのマテリアルに切り替えられたら便利かなと思って作ってみました。

動画とかに使えるかもしれません。

アニメーションをランダムで切り替えるスクリプトや二人組アニメーション用など

アニメーションをランダムで切り替えるスクリプトも書いてみました。

エロ用途に使えるかと思い二人組用もw

おわりに

割と簡単に切り替えられて良かった。

まぁ使い道と言えばえっちなやつに使うとかかな(^_^;)

あとはVTuber的な動画を撮りたいならこういうのが使えるかもしれない。

また何かあれば追記します(*^_^*)

タイトルとURLをコピーしました