sea-battle/Assets/Scripts/UI/Animation/UIAnimationStateSwitcher.cs

163 lines
4.7 KiB
C#

using UnityEngine;
/// <summary>
/// Óïðàâëÿåò ïåðåêëþ÷åíèåì ñîñòîÿíèé Animator Controller
/// Èñïîëüçóåòñÿ äëÿ óïðàâëåíèÿ UI-àíèìàöèÿìè ÷åðåç Animator
/// </summary>
[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<Animator>();
// Åñëè íàçíà÷åí Override Controller - ïðèìåíÿåì åãî
if (overrideController != null && animator.runtimeAnimatorController != overrideController)
{
animator.runtimeAnimatorController = overrideController;
}
}
/// <summary>
/// Óñòàíîâèòü Override Controller ïðîãðàììíî (äëÿ ðàçíûõ ïåðñîíàæåé)
/// </summary>
public void SetOverrideController(AnimatorOverrideController controller)
{
if (animator == null || controller == null) return;
overrideController = controller;
animator.runtimeAnimatorController = controller;
}
/// <summary>
/// Óñòàíîâèòü ñîñòîÿíèå àíèìàöèè ïî ÷èñëîâîìó èíäåêñó
/// </summary>
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;
}
}
/// <summary>
/// Óñòàíîâèòü ñîñòîÿíèå àíèìàöèè ïî èìåíè
/// </summary>
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");
// === Óíèâåðñàëüíûå ìåòîäû äëÿ ðàáîòû ñ ïàðàìåòðàìè ===
/// <summary>
/// Óñòàíîâèòü float ïàðàìåòð (íàïðèìåð, ñêîðîñòü)
/// </summary>
public void SetFloat(string paramName, float value)
{
if (animator == null) return;
animator.SetFloat(paramName, value);
}
/// <summary>
/// Óñòàíîâèòü bool ïàðàìåòð
/// </summary>
public void SetBool(string paramName, bool value)
{
if (animator == null) return;
animator.SetBool(paramName, value);
}
/// <summary>
/// Âûçâàòü òðèããåð ïî èìåíè
/// </summary>
public void SetTrigger(string triggerName)
{
if (animator == null) return;
animator.SetTrigger(triggerName);
}
/// <summary>
/// Ïðîâåðèòü, èãðàåò ëè ñåé÷àñ îïðåäåë¸ííàÿ àíèìàöèÿ
/// </summary>
public bool IsPlayingState(string stateName, int layer = 0)
{
if (animator == null) return false;
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(layer);
return stateInfo.IsName(stateName);
}
/// <summary>
/// Ïîëó÷èòü òåêóùóþ íîðìàëèçîâàííóþ ïîçèöèþ àíèìàöèè (0-1)
/// </summary>
public float GetCurrentStateNormalizedTime(int layer = 0)
{
if (animator == null) return 0f;
return animator.GetCurrentAnimatorStateInfo(layer).normalizedTime;
}
}