Files
Cielonos/Assets/Scripts/MainGame/Effects/Feedbacks/CharacterFeedbackTimeProvider.cs
SoulliesOfficial 41140a2017 新Feedback系统
2026-04-12 02:11:15 -04:00

76 lines
2.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Cielonos.MainGame.Characters;
using SLSUtilities.Feedback;
using UnityEngine;
namespace Cielonos.MainGame.Effects.Feedback
{
/// <summary>
/// IFeedbackTimeProvider 的游戏层实现,从 SelfTimeSubmodule 和 TimeManager 读取时间缩放。
/// 每个角色的 FeedbackSubcontroller 持有一个实例,注入到 FeedbackPlayer 中。
/// </summary>
public class CharacterFeedbackTimeProvider : IFeedbackTimeProvider
{
private readonly CharacterBase _character;
public CharacterFeedbackTimeProvider(CharacterBase character)
{
_character = character;
}
/// <summary>
/// 全局时间缩放TimeManager.globalTimeScale
/// </summary>
public float GlobalTimeScale =>
TimeManager.Instance != null ? TimeManager.Instance.globalTimeScale.Value : 1f;
/// <summary>
/// 分组时间缩放,根据角色 Fraction 返回对应的 TimeManager 通道值。
/// </summary>
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
};
}
}
/// <summary>
/// 角色本地时间缩放SelfTimeSubmodule.localTimeScale
/// </summary>
public float LocalTimeScale =>
_character?.selfTimeSm?.localTimeScale?.Value ?? 1f;
/// <summary>
/// 根据 FeedbackTimeSettings 组合各层级缩放计算实际 deltaTime。
/// </summary>
public float GetDeltaTime(FeedbackTimeSettings settings)
{
if (settings == null || !settings.useTimeScale) return Time.unscaledDeltaTime;
float dt = Time.unscaledDeltaTime;
if (settings.affectedByGlobalTimeScale)
dt *= GlobalTimeScale;
if (settings.affectedByGroupTimeScale)
dt *= GroupTimeScale;
if (settings.affectedByLocalTimeScale)
dt *= LocalTimeScale;
return dt;
}
}
}