using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using AibisDream.Kit; namespace AibisDream { public class AnimatorCenter : SingletonBase { private readonly Dictionary _handlers = new(); private AnimatorCenter() { } public void RegisterHandler(AnimatorHandler handler) { _handlers.Add(handler.animatorName, handler); } public void UnregisterHandler(AnimatorHandler handler) { _handlers.Remove(handler.animatorName); } 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 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(); } } }