2026-04-12 02:11:15 -04:00
|
|
|
|
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>
|
2026-04-18 13:57:19 -04:00
|
|
|
|
public float GlobalTimeScale => TimeManager.Instance != null ? TimeManager.Instance.globalTimeScale.Value : 1f;
|
2026-04-12 02:11:15 -04:00
|
|
|
|
|
|
|
|
|
|
/// <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>
|
2026-04-18 13:57:19 -04:00
|
|
|
|
public float LocalTimeScale => _character?.selfTimeSm?.localTimeScale?.Value ?? 1f;
|
2026-04-12 02:11:15 -04:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-04-18 13:57:19 -04:00
|
|
|
|
/// 根据 FeedbackTimeSettings 计算综合时间缩放系数(不含 deltaTime)。
|
|
|
|
|
|
/// 返回 1.0 表示正常速度。
|
2026-04-12 02:11:15 -04:00
|
|
|
|
/// </summary>
|
2026-04-18 13:57:19 -04:00
|
|
|
|
public float GetTimeScale(FeedbackTimeSettings settings)
|
2026-04-12 02:11:15 -04:00
|
|
|
|
{
|
2026-04-29 06:16:07 -04:00
|
|
|
|
if (_character == null ||
|
|
|
|
|
|
settings == null ||
|
|
|
|
|
|
settings.timeScaleType == FeedbackTimeSettings.TimeScaleType.Unscaled) return 1f;
|
2026-04-12 02:11:15 -04:00
|
|
|
|
|
2026-04-18 13:57:19 -04:00
|
|
|
|
float scale = 1f;
|
2026-04-12 02:11:15 -04:00
|
|
|
|
|
2026-04-18 13:57:19 -04:00
|
|
|
|
if (settings.timeScaleType == FeedbackTimeSettings.TimeScaleType.Global) scale *= GlobalTimeScale;
|
|
|
|
|
|
if (settings.timeScaleType == FeedbackTimeSettings.TimeScaleType.Group) scale *= GroupTimeScale;
|
|
|
|
|
|
if (settings.timeScaleType == FeedbackTimeSettings.TimeScaleType.Local) scale *= LocalTimeScale;
|
2026-04-12 02:11:15 -04:00
|
|
|
|
|
2026-04-18 13:57:19 -04:00
|
|
|
|
return scale;
|
|
|
|
|
|
}
|
2026-04-12 02:11:15 -04:00
|
|
|
|
|
2026-04-18 13:57:19 -04:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 根据 FeedbackTimeSettings 组合各层级缩放计算实际 deltaTime(秒)。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public float GetDeltaTime(FeedbackTimeSettings settings)
|
|
|
|
|
|
{
|
2026-04-29 06:16:07 -04:00
|
|
|
|
if (_character == null) return Time.deltaTime;
|
|
|
|
|
|
|
|
|
|
|
|
return Time.deltaTime * GetTimeScale(settings);
|
2026-04-12 02:11:15 -04:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|