using System.Collections.Generic; using SLSUtilities.General; using UnityEngine; namespace SLSUtilities.Feedback { /// /// 全局 Feedback 播放管理器(Singleton)。 /// 集中驱动所有注册的 FeedbackPlayer,提供 Play / Stop 快捷 API。 /// 适用于不绑定特定角色时间缩放的"全局反馈"(如后处理效果、UI 反馈等)。 /// 需要角色级时间缩放的反馈仍由 FeedbackSubcontroller 手动驱动。 /// public class FeedbackManager : Singleton { private const int INITIAL_CAPACITY = 64; private readonly List _activePlayers = new List(INITIAL_CAPACITY); /// /// 当前活跃的 Player 数量。 /// public int ActiveCount => _activePlayers.Count; /// /// 以全局方式播放一个 FeedbackData,不绑定任何 owner 或 timeProvider。 /// public FeedbackPlayer Play(FeedbackData data) { return Play(data, null, null); } /// /// 播放一个 FeedbackData,指定时间提供者和 owner。 /// public FeedbackPlayer Play(FeedbackData data, IFeedbackTimeProvider timeProvider, Transform owner) { if (data == null) { Debug.LogWarning("[FeedbackManager] Cannot play: FeedbackData is null."); return null; } var player = new FeedbackPlayer(data, timeProvider, owner); player.Play(); _activePlayers.Add(player); return player; } /// /// 注册一个已有的 FeedbackPlayer 由管理器驱动。 /// 适用于外部创建 Player 后需要交给管理器集中管理的场景。 /// public void Register(FeedbackPlayer player) { if (player == null || _activePlayers.Contains(player)) return; _activePlayers.Add(player); } /// /// 停止并移除指定的 FeedbackPlayer。 /// public void Stop(FeedbackPlayer player) { if (player == null) return; player.Stop(); _activePlayers.Remove(player); } /// /// 停止所有活跃的 FeedbackPlayer。 /// public void StopAll() { for (int i = _activePlayers.Count - 1; i >= 0; i--) { _activePlayers[i].Stop(); } _activePlayers.Clear(); } private void Update() { float dt = Time.unscaledDeltaTime; for (int i = _activePlayers.Count - 1; i >= 0; i--) { FeedbackPlayer player = _activePlayers[i]; player.Tick(dt); if (player.IsCompleted || !player.IsActive) { _activePlayers.RemoveAt(i); } } } } }