Files
Cielonos/Assets/Scripts/MainGame/Items/Submodules/FeedbackSubcontroller.cs
SoulliesOfficial 649b7a5ddc 更新
2026-05-23 08:27:50 -04:00

133 lines
4.2 KiB
C#

using System.Collections.Generic;
using Cielonos.MainGame.Effects.Feedback;
using SLSUtilities.Feedback;
using UnityEngine;
namespace Cielonos.MainGame.Inventory
{
public class FeedbackSubcontroller : SubcontrollerBase<ItemBase>
{
public FeedbackDataCollection feedbackDataCollection;
public FeedbackData this[string feedbackName] => GetFeedbackData(feedbackName);
private CharacterFeedbackTimeProvider _timeProvider;
private readonly List<FeedbackPlayer> _activePlayers = new List<FeedbackPlayer>(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;
}
/// <summary>
/// 通过新系统播放一个 FeedbackData。
/// </summary>
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;
}
/// <summary>
/// 通过名称从 FeedbackDataCollection 中查找并播放。
/// </summary>
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);
}
/// <summary>
/// 停止指定 FeedbackData 的所有活跃播放器。
/// </summary>
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);
}
}
}
/// <summary>
/// 按名称停止正在播放的 Feedback。
/// </summary>
public void StopFeedback(string feedbackName)
{
if (feedbackDataCollection == null) return;
if (feedbackDataCollection.TryGet(feedbackName, out FeedbackData data))
{
StopFeedback(data);
}
}
/// <summary>
/// 停止所有活跃的新系统播放器。
/// </summary>
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);
}
}
}
}
}