using System.Collections.Generic; using UnityEngine; public class AnimationDistributor : StateMachineBehaviour { [SerializeField] private float _minSwitchTime = 5; [SerializeField] private float _maxSwitchTime = 10; [SerializeField] List _triggers; [SerializeField] bool _instantSwitch; private List _shuffledTriggers; private int _currentIndex = 0; private float _nextSwitchTime = 0; private bool _triggerSetted = false; public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { _triggerSetted = false; if (_instantSwitch) _nextSwitchTime = Time.time; else _nextSwitchTime = Time.time + Random.Range(_minSwitchTime, _maxSwitchTime); } public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { if (Time.time < _nextSwitchTime) return; if (_triggerSetted == false) { animator.SetTrigger(GetNextTrigger()); _triggerSetted = true; } } public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { _triggerSetted = false; } private string GetNextTrigger() { var shuffled = GetShuffledList(); string trigger = shuffled[_currentIndex]; _currentIndex++; if (_currentIndex >= shuffled.Count) { _shuffledTriggers = null; _currentIndex = 0; } return trigger; } private List GetShuffledList() { if (_shuffledTriggers == null || _shuffledTriggers.Count == 0) { System.Random rng = new System.Random(); _shuffledTriggers = new List(_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; } }