using System.Collections.Generic; using Ichni.RhythmGame; using SLSUtilities.General; using UnityEngine; namespace Ichni { /// /// 编辑器 AnimationManager:集中管理场上所有 AnimationBase 实例的逐帧更新。 /// 替代 AnimationBase.Update() 中大量零散的 MonoBehaviour 帧回调, /// 由 EditorManager.Update 统一驱动,减少 Update() 调用开销。 /// 倒序遍历防止在更新途中某个动画自行销毁导致越界。 /// public class AnimationManager : Singleton { #region [单例别名] Singleton Alias public new static AnimationManager instance => Instance; #endregion #region [活跃动画列表] Active Animation List private readonly List _activeAnimations = new List(200); #endregion #region [注册与注销] Registration public void RegisterAnimation(AnimationBase anim) { if (!_activeAnimations.Contains(anim)) _activeAnimations.Add(anim); } public void UnregisterAnimation(AnimationBase anim) => _activeAnimations.Remove(anim); #endregion #region [中央集权主循环] Manager-Driven Tick /// /// 由 EditorManager.Update 统一调度。 /// 倒序遍历以防在更新途中某个动画自行销毁导致列表越界。 /// public void ManualTick(float songTime) { for (int i = _activeAnimations.Count - 1; i >= 0; i--) { var anim = _activeAnimations[i]; if (!anim.isActiveAndEnabled) continue; if (anim.timeDurationSubmodule.CheckTimeInDuration(songTime)) { anim.InvokeUpdate(); } } } #endregion } }