using System; using System.Collections.Generic; using Cielonos.MainGame.Effects.Feedback; using MoreMountains.Feedbacks; using SLSUtilities.Feedback; using SLSUtilities.FeelAssistance; using UnityEngine; namespace Cielonos.MainGame.Characters.Inventory { public class FeedbackSubcontroller : SubcontrollerBase { // === 旧系统(Feel)—— 保留向后兼容 === public Dictionary feedbacks; public FeedbackUnit this[string feedbackName] => feedbacks.GetValueOrDefault(feedbackName, null); // === 新系统(Feedback System)=== public FeedbackDataCollection feedbackDataCollection; private CharacterFeedbackTimeProvider _timeProvider; private readonly List _activePlayers = new List(8); public override void Initialize() { base.Initialize(); if (owner?.player != null) { _timeProvider = new CharacterFeedbackTimeProvider(owner.player); } } /// /// 通过新系统播放一个 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); } } } /// /// 停止所有活跃的新系统播放器。 /// public void StopAllFeedbacks() { for (int i = _activePlayers.Count - 1; i >= 0; i--) { _activePlayers[i].Stop(); } _activePlayers.Clear(); } private void Update() { // 旧系统驱动 if (feedbacks != null) { foreach (var feedbackUnit in feedbacks.Values) { float timeScaleMultiplier = owner.player.selfTimeSm.TimeScale; feedbackUnit.feedback.ExternalTimeScale = timeScaleMultiplier; feedbackUnit.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); } } } } }