207 lines
6.6 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|