163 lines
4.7 KiB
C#
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;
|
|
}
|
|
}
|
|
|