chip-gameV3/Assets/Scripts/Gameplay/Animation/AnimationDistributor.cs

78 lines
2.1 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 _instantSwitch;
private List<string> _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<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;
}
}