using Cielonos.MainGame.Characters; using SLSUtilities.Feedback; using UnityEngine; namespace Cielonos.MainGame.Effects.Feedback { /// /// IFeedbackTimeProvider 的游戏层实现,从 SelfTimeSubmodule 和 TimeManager 读取时间缩放。 /// 每个角色的 FeedbackSubcontroller 持有一个实例,注入到 FeedbackPlayer 中。 /// public class CharacterFeedbackTimeProvider : IFeedbackTimeProvider { private readonly CharacterBase _character; public CharacterFeedbackTimeProvider(CharacterBase character) { _character = character; } /// /// 全局时间缩放(TimeManager.globalTimeScale)。 /// public float GlobalTimeScale => TimeManager.Instance != null ? TimeManager.Instance.globalTimeScale.Value : 1f; /// /// 分组时间缩放,根据角色 Fraction 返回对应的 TimeManager 通道值。 /// public float GroupTimeScale { get { if (TimeManager.Instance == null || _character == null) return 1f; return _character.fraction switch { Fraction.Player => TimeManager.Instance.playerTimeScale.Value, Fraction.AlliedMinion => TimeManager.Instance.alliedMinionTimeScale.Value * TimeManager.Instance.nonPlayerTimeScale.Value, Fraction.Enemy => TimeManager.Instance.enemyTimeScale.Value * TimeManager.Instance.nonPlayerTimeScale.Value, Fraction.Neutral => TimeManager.Instance.nonPlayerTimeScale.Value, _ => 1f }; } } /// /// 角色本地时间缩放(SelfTimeSubmodule.localTimeScale)。 /// public float LocalTimeScale => _character?.selfTimeSm?.localTimeScale?.Value ?? 1f; /// /// 根据 FeedbackTimeSettings 计算综合时间缩放系数(不含 deltaTime)。 /// 返回 1.0 表示正常速度。 /// public float GetTimeScale(FeedbackTimeSettings settings) { if (_character == null || settings == null || settings.timeScaleType == FeedbackTimeSettings.TimeScaleType.Unscaled) return 1f; float scale = 1f; if (settings.timeScaleType == FeedbackTimeSettings.TimeScaleType.Global) scale *= GlobalTimeScale; if (settings.timeScaleType == FeedbackTimeSettings.TimeScaleType.Group) scale *= GroupTimeScale; if (settings.timeScaleType == FeedbackTimeSettings.TimeScaleType.Local) scale *= LocalTimeScale; return scale; } /// /// 根据 FeedbackTimeSettings 组合各层级缩放计算实际 deltaTime(秒)。 /// public float GetDeltaTime(FeedbackTimeSettings settings) { if (_character == null) return Time.deltaTime; return Time.deltaTime * GetTimeScale(settings); } } }