using System.Collections.Generic; using Cielonos.MainGame.Effects.Feedback; using Lean.Pool; using MoreMountains.Feedbacks; using MoreMountains.FeedbacksForThirdParty; using SLSUtilities.Feedback; using SLSUtilities.FeelAssistance; using UnityEngine; namespace Cielonos.MainGame.Characters { public partial 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 != null) { _timeProvider = new CharacterFeedbackTimeProvider(owner); } } 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); } var player = new FeedbackPlayer(data, _timeProvider, owner?.transform); player.Play(); _activePlayers.Add(player); return player; } /// /// 通过名称从 FeedbackDataCollection 中查找并播放。 /// public FeedbackPlayer PlayFeedback(string name, bool stopPrevious = false) { if (feedbackDataCollection == null) { Debug.LogWarning($"[FeedbackSubcontroller] feedbackDataCollection is null on {owner?.name}."); return null; } if (!feedbackDataCollection.TryGet(name, out FeedbackData data)) { Debug.LogWarning($"[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.selfTimeSm.TimeScale; feedbackUnit.feedback.ExternalTimeScale = timeScaleMultiplier; feedbackUnit.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); } } } } }