Unityでアニメーションをランダム遷移させるスクリプトを書いたメモ。遷移間隔やループ回数指定、速度変更もできる

unity アニメーション ランダム 遷移 Unity
※記事内に広告が含まれています。

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

この記事はUnityでアニメーションをランダム遷移させるスクリプトを書いたメモです。

単にアニメーションを切り替えるだけなら以前記事を書いたので↓こちらを参考に。

●PRスペース●
■PR■

現在人気商品が最大90%以上オフで買えるAmazonプライム感謝祭先行セールをやってるみたいです(2025/10/10 23:59まで )。

Amazonプライム感謝祭 先行セール開催中 最大90%以上オフ

燃えにくく安全性の高いエレコム ナトリウムイオンモバイルバッテリーがかなり安くなっているので私も買いました。

エレコム ナトリウムイオン モバイルバッテリー

品薄だからか配送まで一ヶ月くらいかかるみたいですが、そろそろモバイルバッテリーが消耗している人におススメです。

エレコム モバイルバッテリー 9000mAh 45W 【世界初】ナトリウムイオン電池 USB PD対応

〇まゆみマート|BOOTH

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

アニメーションをランダム遷移させるスクリプト RandomAnimationSwitcher.cs

エロいアニメーションに使えるかと思い(笑)、ChatGPT氏に書いてもらった。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RandomAnimationSwitcher : MonoBehaviour
{
    [System.Serializable]
    public class AnimationData
    {
        public string animationName;
        public int loopCount = 1; // ループ回数
    }

    public Animator animator;
    public List<AnimationData> animations = new List<AnimationData>();
    public float transitionDelay = 0.5f; // アニメーション遷移間隔
    public float transitionTime = 0.3f; // フェード時間

    private int currentLoop = 0;
    private AnimationData currentAnimation;
    private float speedMultiplier = 1.0f;

    void Start()
    {
        if (animator == null)
            animator = GetComponent<Animator>();

        StartCoroutine(PlayRandomAnimations());
    }

    void Update()
    {
        // 速度切り替え(1: 低速, 2: 通常, 3: 高速)
        if (Input.GetKeyDown(KeyCode.Alpha1)) speedMultiplier = 0.5f;
        if (Input.GetKeyDown(KeyCode.Alpha2)) speedMultiplier = 1.0f;
        if (Input.GetKeyDown(KeyCode.Alpha3)) speedMultiplier = 1.5f;

        animator.speed = speedMultiplier;
    }

    IEnumerator PlayRandomAnimations()
    {
        while (true)
        {
            currentAnimation = animations[Random.Range(0, animations.Count)];
            currentLoop = 0;

            while (currentLoop < currentAnimation.loopCount)
            {
                animator.CrossFade(currentAnimation.animationName, transitionTime);
                yield return new WaitForSeconds(GetCurrentAnimationLength());
                currentLoop++;
            }

            yield return new WaitForSeconds(transitionDelay); // 遷移間隔はそのまま適用
        }
    }

    private float GetCurrentAnimationLength()
    {
        return animator.GetCurrentAnimatorStateInfo(0).length / speedMultiplier;
    }
}

使い方:モデルにアタッチしてアニメーションを指定する

コードをコピペしてモデルにアタッチします。

unity アニメーション ランダム 遷移

アニメーターとアニメーション名を手動で指定します。アニメーション数に上限はない。

アニメーションはアニメーターに読み込んでおく必要があります。遷移はスクリプトでやるので、アニメーションを読み込むだけでOK。

unity アニメーション ランダム 遷移

ループ回数と遷移間隔指定もできる

アニメーションごとに何回ループするかも指定できます。

unity アニメーション ランダム 遷移

何秒かけて遷移するかのTransition Timeと、ループが終わった後の待機時間のTransition Delayが指定できるようにしてあります。

ここをいじると遷移を滑らかにしたり調整できます。

unity アニメーション ランダム 遷移

こんな感じで動きます

ちゃんと切り替わってますね。

種類の似た差分アニメーションだけセットしたほうがいいかも?

これ用途にもよるけど、Idle状態1⇒Idle状態2⇒Idle状態3⇒Idle状態2みたいに切り替えていくなら違和感なくて良いと思うんだけど。

Idle状態1⇒Run1⇒Sleep1…とかになると動きの差が激しすぎて「どうしたんだコイツΣ(゚Д゚)」って感じになるから、種類の似た差分アニメーションだけ切り替えるようにした方が良いかもしれない。

まぁ単にアニメーションのデモみたいな感じで使うならそれでもいいけども。

長いアニメーションは作るのもメンテナンスも大変だから、小分けにして切り替えた方がいいか…?

これエロいアニメーションとかを作っていて思ったけど、長いアニメーションは作るのも後でいじるのも大変なんですよね…。

小分けにして切り替える方が後で使いまわせたり汎用性が高いような?

私はアニメーションの動画を撮って保存して、非公開のウェブページで一覧にしたりしてますけど。

二人組のアニメーションをランダムで切り替える方法

二人組のアニメーションをランダムで切り替えるスクリプトも書いたので興味のある方はこちらもどうぞ。

二人のモデルの位置とアニメーションのフレーム数を合わせる必要があるけど。

まぁ主にエロ用ですかね(笑)。

差分作りまくって遷移間隔を調整して滑らかに遷移させれば、短いアニメーションの集合でもそれっぽくなると思います。

単調なループアニメーションの繰り返しだと飽きるので。

おわりに

案外簡単に切り替えられて良かった。

Idle状態のアニメーションとか、とりあえずなんでもいいから動かしたい時はランダムでやっておくと良いような気がします。

改良したら追記します(*^_^*)

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