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;
}
}