using System.Collections.Generic; using Cielonos.MainGame.Effects.Feedback; using SLSUtilities.Feedback; using UnityEngine; namespace Cielonos.MainGame.Characters.Inventory { public class FeedbackSubcontroller : SubcontrollerBase { public FeedbackDataCollection feedbackDataCollection; public FeedbackData this[string feedbackName] => GetFeedbackData(feedbackName); private CharacterFeedbackTimeProvider _timeProvider; private readonly List _activePlayers = new List(8); public override void Initialize() { base.Initialize(); _timeProvider = new CharacterFeedbackTimeProvider(owner.player); } public FeedbackData GetFeedbackData(string feedbackName) { if (feedbackDataCollection == null) { Debug.LogWarning($"[Item.FeedbackSubcontroller] feedbackDataCollection is null on {owner?.name}."); return null; } if (!feedbackDataCollection.TryGet(feedbackName, out FeedbackData data)) { Debug.LogWarning($"[Item.FeedbackSubcontroller] FeedbackData '{feedbackName}' not found on {owner?.name}."); return null; } return data; } /// /// 通过新系统播放一个 FeedbackData。 /// public FeedbackPlayer PlayFeedback(FeedbackData data, bool stopPrevious = false) { if (data == null) return null; if (stopPrevious) { StopFeedback(data); } Transform ownerTransform = owner?.player?.transform; var player = new FeedbackPlayer(data, _timeProvider, ownerTransform); player.Play(); _activePlayers.Add(player); return player; } /// /// 通过名称从 FeedbackDataCollection 中查找并播放。 /// public FeedbackPlayer PlayFeedback(string name, bool stopPrevious = false) { if (feedbackDataCollection == null) { Debug.LogWarning($"[Item.FeedbackSubcontroller] feedbackDataCollection is null on {owner?.name}."); return null; } if (!feedbackDataCollection.TryGet(name, out FeedbackData data)) { Debug.LogWarning($"[Item.FeedbackSubcontroller] FeedbackData '{name}' not found on {owner?.name}."); return null; } return PlayFeedback(data, stopPrevious); } /// /// 停止指定 FeedbackData 的所有活跃播放器。 /// public void StopFeedback(FeedbackData data) { for (int i = _activePlayers.Count - 1; i >= 0; i--) { if (_activePlayers[i].Data == data) { _activePlayers[i].Stop(); _activePlayers.RemoveAt(i); } } } /// /// 按名称停止正在播放的 Feedback。 /// public void StopFeedback(string feedbackName) { if (feedbackDataCollection == null) return; if (feedbackDataCollection.TryGet(feedbackName, out FeedbackData data)) { StopFeedback(data); } } /// /// 停止所有活跃的新系统播放器。 /// public void StopAllFeedbacks() { for (int i = _activePlayers.Count - 1; i >= 0; i--) { _activePlayers[i].Stop(); } _activePlayers.Clear(); } private void Update() { float dt = Time.deltaTime; for (int i = _activePlayers.Count - 1; i >= 0; i--) { FeedbackPlayer player = _activePlayers[i]; player.Tick(dt); if (player.IsCompleted || !player.IsActive) { _activePlayers.RemoveAt(i); } } } } }