バーチャル3Dクリエイター神部まゆみです(*^_^*)
この記事はUnityでアニメーションをランダム遷移させるスクリプトを書いたメモです。
単にアニメーションを切り替えるだけなら以前記事を書いたので↓こちらを参考に。
アニメーションをランダム遷移させるスクリプト 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;
}
}
使い方:モデルにアタッチしてアニメーションを指定する
コードをコピペしてモデルにアタッチします。


アニメーターとアニメーション名を手動で指定します。アニメーション数に上限はない。
アニメーションはアニメーターに読み込んでおく必要があります。遷移はスクリプトでやるので、アニメーションを読み込むだけでOK。


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


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


こんな感じで動きます
ちゃんと切り替わってますね。
種類の似た差分アニメーションだけセットしたほうがいいかも?
これ用途にもよるけど、Idle状態1⇒Idle状態2⇒Idle状態3⇒Idle状態2みたいに切り替えていくなら違和感なくて良いと思うんだけど。
Idle状態1⇒Run1⇒Sleep1…とかになると動きの差が激しすぎて「どうしたんだコイツΣ(゚Д゚)」って感じになるから、種類の似た差分アニメーションだけ切り替えるようにした方が良いかもしれない。
まぁ単にアニメーションのデモみたいな感じで使うならそれでもいいけども。
長いアニメーションは作るのもメンテナンスも大変だから、小分けにして切り替えた方がいいか…?
これエロいアニメーションとかを作っていて思ったけど、長いアニメーションは作るのも後でいじるのも大変なんですよね…。
小分けにして切り替える方が後で使いまわせたり汎用性が高いような?
私はアニメーションの動画を撮って保存して、非公開のウェブページで一覧にしたりしてますけど。
二人組のアニメーションをランダムで切り替える方法
二人組のアニメーションをランダムで切り替えるスクリプトも書いたので興味のある方はこちらもどうぞ。
二人のモデルの位置とアニメーションのフレーム数を合わせる必要があるけど。
まぁ主にエロ用ですかね(笑)。
差分作りまくって遷移間隔を調整して滑らかに遷移させれば、短いアニメーションの集合でもそれっぽくなると思います。
単調なループアニメーションの繰り返しだと飽きるので。
おわりに
案外簡単に切り替えられて良かった。
Idle状態のアニメーションとか、とりあえずなんでもいいから動かしたい時はランダムでやっておくと良いような気がします。
改良したら追記します(*^_^*)