Files

207 lines
6.6 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using AibisDream.Kit;
namespace AibisDream
{
public class AnimatorCenter : SingletonBase<AnimatorCenter>
{
private readonly Dictionary<string, AnimatorHandler> _handlers = new();
private readonly Dictionary<string, RandomAnimatorHandler> _randomHandlers = new();
private AnimatorCenter() { }
public void RegisterHandler(AnimatorHandler handler)
{
_handlers.Add(handler.animatorName, handler);
}
public void UnregisterHandler(AnimatorHandler handler)
{
_handlers.Remove(handler.animatorName);
}
public void RegisterRandomHandler(RandomAnimatorHandler handler)
{
_randomHandlers.Add(handler.handelrName, handler);
}
public void UnregisterRandomHandler(RandomAnimatorHandler handler)
{
_randomHandlers.Remove(handler.handelrName);
}
public void StartRandomAnimation(string handlerName)
{
if (!TryGetRandomHandler(handlerName, out RandomAnimatorHandler randomHandler))
return;
randomHandler.StartRandomPlay();
}
public void StopRandomAnimation(string handlerName)
{
if (!TryGetRandomHandler(handlerName, out RandomAnimatorHandler randomHandler))
return;
randomHandler.StopRandomPlay();
}
private bool TryGetRandomHandler(string handlerName, out RandomAnimatorHandler handler)
{
if (_randomHandlers.TryGetValue(handlerName, out handler))
return true;
Debug.LogError($"AnimatorCenter: 未找到名为 \"{handlerName}\" 的 RandomAnimatorHandler。");
handler = null;
return false;
}
private bool TryGetHandler(string animatorName, out AnimatorHandler handler)
{
if (_handlers.TryGetValue(animatorName, out handler))
return true;
Debug.LogError($"AnimatorCenter: 未找到名为 \"{animatorName}\" 的 AnimatorHandler。");
handler = null;
return false;
}
public void PlayAnimation(string animatorName, string stateName, int layer = 0, Action onComplete = null)
{
if (!TryGetHandler(animatorName, out AnimatorHandler animatorHandler))
return;
animatorHandler.SetAnimatorObjectActive(true);
animatorHandler.Play(stateName, layer, onComplete);
}
public IEnumerator PlayAnimationAsync(string animatorName, string stateName, int layer = 0)
{
if (!TryGetHandler(animatorName, out AnimatorHandler animatorHandler))
yield break;
animatorHandler.SetAnimatorObjectActive(true);
yield return animatorHandler.PlayAsync(stateName, layer);
}
public void PlayAnimationFromAddressable(string animatorName, string addressableKey, string stateName,
int layer = 0, Action onComplete = null)
{
if (!TryGetHandler(animatorName, out AnimatorHandler animatorHandler))
return;
animatorHandler.SetAnimatorObjectActive(true);
animatorHandler.PlayFromAddressable(addressableKey, stateName, layer, onComplete);
}
public IEnumerator PlayAnimationFromAddressableAsync(string animatorName, string addressableKey,
string stateName, int layer = 0)
{
if (!TryGetHandler(animatorName, out AnimatorHandler animatorHandler))
yield break;
animatorHandler.SetAnimatorObjectActive(true);
yield return animatorHandler.PlayFromAddressableAsync(addressableKey, stateName, layer);
}
public void StopAnimation(string animatorName)
{
if (!TryGetHandler(animatorName, out AnimatorHandler animatorHandler))
return;
animatorHandler.Stop();
}
public void PauseAnimation(string animatorName)
{
if (!TryGetHandler(animatorName, out AnimatorHandler animatorHandler))
return;
animatorHandler.Pause();
}
public void ResumeAnimation(string animatorName)
{
if (!TryGetHandler(animatorName, out AnimatorHandler animatorHandler))
return;
animatorHandler.Resume();
}
public void ResetAnimation(string animatorName)
{
if (!TryGetHandler(animatorName, out AnimatorHandler animatorHandler))
return;
animatorHandler.Reset();
}
public void ReturnToDefaultState(string animatorName)
{
if (!TryGetHandler(animatorName, out AnimatorHandler animatorHandler))
return;
animatorHandler.ReturnToDefaultState();
}
public void HideAnimation(string animatorName)
{
if (!TryGetHandler(animatorName, out AnimatorHandler animatorHandler))
return;
animatorHandler.SetAnimatorObjectActive(false);
}
public float GetPlaybackTime(string animatorName, int layer = 0)
{
return TryGetHandler(animatorName, out AnimatorHandler animatorHandler)
? animatorHandler.GetPlaybackTime(layer)
: 0f;
}
public float GetDuration(string animatorName, int layer = 0)
{
return TryGetHandler(animatorName, out AnimatorHandler animatorHandler)
? animatorHandler.GetDuration(layer)
: 0f;
}
public void SetPlaybackSpeed(string animatorName, float speed)
{
if (!TryGetHandler(animatorName, out AnimatorHandler animatorHandler))
return;
animatorHandler.SetPlaybackSpeed(speed);
}
public void SeekToTime(string animatorName, double timeSeconds, int layer = 0)
{
if (!TryGetHandler(animatorName, out AnimatorHandler animatorHandler))
return;
animatorHandler.SeekToTime(timeSeconds, layer);
}
public void PauseAll()
{
foreach (AnimatorHandler registeredHandler in _handlers.Values)
registeredHandler.Pause();
}
public void StopAll()
{
foreach (AnimatorHandler registeredHandler in _handlers.Values)
registeredHandler.Stop();
}
public void ResetAll()
{
foreach (AnimatorHandler registeredHandler in _handlers.Values)
registeredHandler.Reset();
}
}
}