63 lines
1.7 KiB
C#
63 lines
1.7 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class AnimationDistributor : StateMachineBehaviour
|
|
{
|
|
[SerializeField] private float _minSwitchTime = 5;
|
|
[SerializeField] private float _maxSwitchTime = 10;
|
|
[SerializeField] List<string> _triggers;
|
|
|
|
[SerializeField] bool _useAnimLength;
|
|
|
|
|
|
private List<string> _shuffledTriggers;
|
|
private int _currentIndex = 0;
|
|
private float _nextSwitchTime = 0;
|
|
|
|
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
|
{
|
|
if (Time.time < _nextSwitchTime) return;
|
|
|
|
animator.SetTrigger(GetNextTrigger());
|
|
|
|
if (_useAnimLength)
|
|
_nextSwitchTime = Time.time + stateInfo.length;
|
|
else
|
|
_nextSwitchTime = Time.time + Random.Range(_minSwitchTime, _maxSwitchTime);
|
|
}
|
|
|
|
private string GetNextTrigger()
|
|
{
|
|
var shuffled = GetShuffledList();
|
|
string trigger = shuffled[_currentIndex];
|
|
_currentIndex++;
|
|
|
|
if (_currentIndex >= shuffled.Count)
|
|
{
|
|
_shuffledTriggers = null;
|
|
_currentIndex = 0;
|
|
}
|
|
|
|
return trigger;
|
|
}
|
|
|
|
private List<string> GetShuffledList()
|
|
{
|
|
if (_shuffledTriggers == null || _shuffledTriggers.Count == 0)
|
|
{
|
|
System.Random rng = new System.Random();
|
|
_shuffledTriggers = new List<string>(_triggers);
|
|
|
|
int n = _shuffledTriggers.Count;
|
|
|
|
while (n > 1)
|
|
{
|
|
n--;
|
|
int k = rng.Next(n + 1);
|
|
(_shuffledTriggers[k], _shuffledTriggers[n]) = (_shuffledTriggers[n], _shuffledTriggers[k]);
|
|
}
|
|
}
|
|
|
|
return _shuffledTriggers;
|
|
}
|
|
} |