Files
Cielonos/Assets/Scripts/MainGame/Characters/Base/Subcontrollers/FeedbackSubcontroller.cs
SoulliesOfficial 8ad26129b2 Feel滚
2026-04-29 06:16:07 -04:00

135 lines
4.2 KiB
C#

using System.Collections.Generic;
using Cielonos.MainGame.Effects.Feedback;
using SLSUtilities.Feedback;
using UnityEngine;
namespace Cielonos.MainGame.Characters
{
public partial class FeedbackSubcontroller : SubcontrollerBase<CharacterBase>
{
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();
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;
}
/// <summary>
/// 通过新系统播放一个 FeedbackData。
/// </summary>
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;
}
/// <summary>
/// 通过名称从 FeedbackDataCollection 中查找并播放。
/// </summary>
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);
}
/// <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);
}
}
}
}
}