using UnityEngine; /// /// Управляет переключением состояний Animator Controller /// Используется для управления UI-анимациями через Animator /// [RequireComponent(typeof(Animator))] public class UIAnimationStateSwitcher : MonoBehaviour { private Animator animator; [Header("Override Controller (опционально)")] [Tooltip("Можно назначить AnimatorOverrideController для разных персонажей")] [SerializeField] private AnimatorOverrideController overrideController; // Хэши базовых состояний (работают через Override Controller) private static readonly int WalkkState = Animator.StringToHash("wallk"); private static readonly int StopState = Animator.StringToHash("stop"); private static readonly int IdleState = Animator.StringToHash("Idle"); private static readonly int VictoryState = Animator.StringToHash("victory"); private static readonly int DefeatState = Animator.StringToHash("defeat"); private void Awake() { animator = GetComponent(); // Если назначен Override Controller - применяем его if (overrideController != null && animator.runtimeAnimatorController != overrideController) { animator.runtimeAnimatorController = overrideController; } } /// /// Установить Override Controller программно (для разных персонажей) /// public void SetOverrideController(AnimatorOverrideController controller) { if (animator == null || controller == null) return; overrideController = controller; animator.runtimeAnimatorController = controller; } /// /// Установить состояние анимации по числовому индексу /// public void SetState(int stateIndex) { if (animator == null) return; // Переключение по индексу (0=wallk, 1=stop, 2=Idle, 3=victory, 4=defeat) switch (stateIndex) { case 0: PlayWalkk(); break; case 1: PlayStop(); break; case 2: PlayIdle(); break; case 3: PlayVictory(); break; case 4: PlayDefeat(); break; } } /// /// Установить состояние анимации по имени /// public void SetState(string stateName) { if (animator == null) return; animator.Play(stateName); } // === Методы для конкретных состояний === public void PlayWalkk() { if (animator == null) return; animator.Play(WalkkState); } public void PlayStop() { if (animator == null) return; animator.Play(StopState); } public void PlayIdle() { if (animator == null) return; animator.Play(IdleState); } public void PlayVictory() { if (animator == null) return; animator.Play(VictoryState); } public void PlayDefeat() { if (animator == null) return; animator.Play(DefeatState); } // === Проверки состояний === public bool IsWalking() => IsPlayingState("walkk"); public bool IsStopped() => IsPlayingState("stop"); public bool IsIdle() => IsPlayingState("Idle"); public bool IsVictory() => IsPlayingState("victory"); public bool IsDefeat() => IsPlayingState("defeat"); // === Универсальные методы для работы с параметрами === /// /// Установить float параметр (например, скорость) /// public void SetFloat(string paramName, float value) { if (animator == null) return; animator.SetFloat(paramName, value); } /// /// Установить bool параметр /// public void SetBool(string paramName, bool value) { if (animator == null) return; animator.SetBool(paramName, value); } /// /// Вызвать триггер по имени /// public void SetTrigger(string triggerName) { if (animator == null) return; animator.SetTrigger(triggerName); } /// /// Проверить, играет ли сейчас определённая анимация /// public bool IsPlayingState(string stateName, int layer = 0) { if (animator == null) return false; AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(layer); return stateInfo.IsName(stateName); } /// /// Получить текущую нормализованную позицию анимации (0-1) /// public float GetCurrentStateNormalizedTime(int layer = 0) { if (animator == null) return 0f; return animator.GetCurrentAnimatorStateInfo(layer).normalizedTime; } }