新Feedback系统
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user