狗屎Minimax坏我代码
This commit is contained in:
@@ -126,7 +126,7 @@ namespace SLSUtilities.Feedback
|
||||
/// <summary>
|
||||
/// 每帧由外部驱动调用(FeedbackManager 或 Subcontroller)。
|
||||
/// </summary>
|
||||
public void Tick(float unscaledDeltaTime)
|
||||
public void Tick(float deltaTime)
|
||||
{
|
||||
if (_state != FeedbackPlayerState.Playing) return;
|
||||
if (_data == null || _data.tracks == null) return;
|
||||
@@ -155,14 +155,17 @@ namespace SLSUtilities.Feedback
|
||||
FeedbackClip clip = track.clips[clipIdx];
|
||||
if (clip?.action == null) continue;
|
||||
|
||||
float clipDeltaTime = ComputeClipDeltaTime(clip, unscaledDeltaTime);
|
||||
ProcessClip(trackIdx, clipIdx, clip, clipDeltaTime);
|
||||
float clipTimeScale = ComputeClipTimeScale(clip);
|
||||
float clipDeltaTime = deltaTime * clipTimeScale;
|
||||
ProcessClip(trackIdx, clipIdx, clip, clipDeltaTime, clipTimeScale);
|
||||
}
|
||||
}
|
||||
|
||||
_currentTime += unscaledDeltaTime;
|
||||
_currentTime += deltaTime;
|
||||
|
||||
if (_currentTime >= totalDuration)
|
||||
// 仅当时间线游标超过总时长 且 所有 Clip 已结束时才完成。
|
||||
// 这避免了因时间缩放导致 Clip 尚在播放就被提前完成的问题。
|
||||
if (_currentTime >= totalDuration && AllClipsFinished())
|
||||
{
|
||||
_state = FeedbackPlayerState.Idle;
|
||||
_isCompleted = true;
|
||||
@@ -214,25 +217,24 @@ namespace SLSUtilities.Feedback
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据 Clip 的时间设置计算实际 deltaTime。
|
||||
/// 根据 Clip 的时间设置计算综合时间缩放系数。
|
||||
/// </summary>
|
||||
private float ComputeClipDeltaTime(FeedbackClip clip, float unscaledDeltaTime)
|
||||
private float ComputeClipTimeScale(FeedbackClip clip)
|
||||
{
|
||||
if (_timeProvider == null) return unscaledDeltaTime;
|
||||
if (_timeProvider == null) return 1f;
|
||||
if (clip?.action == null || clip.action.IgnoreTimeScale) return 1f;
|
||||
|
||||
FeedbackTimeSettings settings = clip.overrideTimeSettings
|
||||
? clip.timeSettings
|
||||
: _data.defaultTimeSettings;
|
||||
FeedbackTimeSettings settings = clip.overrideTimeSettings ? clip.timeSettings : _data.defaultTimeSettings;
|
||||
|
||||
if (settings == null || !settings.useTimeScale) return unscaledDeltaTime;
|
||||
if (settings == null || settings.timeScaleType == FeedbackTimeSettings.TimeScaleType.Unscaled) return 1f;
|
||||
|
||||
return _timeProvider.GetDeltaTime(settings);
|
||||
return _timeProvider.GetTimeScale(settings);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理单个 Clip 的生命周期状态转换和回调调用。
|
||||
/// </summary>
|
||||
private void ProcessClip(int trackIdx, int clipIdx, FeedbackClip clip, float deltaTime)
|
||||
private void ProcessClip(int trackIdx, int clipIdx, FeedbackClip clip, float deltaTime, float timeScale)
|
||||
{
|
||||
ref ClipState clipState = ref _clipStates[trackIdx, clipIdx];
|
||||
ref float elapsed = ref _clipElapsedTimes[trackIdx, clipIdx];
|
||||
@@ -247,30 +249,40 @@ namespace SLSUtilities.Feedback
|
||||
clipState = ClipState.Active;
|
||||
elapsed = _currentTime - clip.startTime;
|
||||
|
||||
FeedbackContext ctx = CreateContext(deltaTime, elapsed, safeDuration);
|
||||
FeedbackContext ctx = CreateContext(deltaTime, elapsed, safeDuration, timeScale, clip.timeSettings);
|
||||
clip.action.OnStart(ctx);
|
||||
|
||||
float normalizedTime = Mathf.Clamp01(elapsed / safeDuration);
|
||||
clip.action.OnUpdate(CreateContext(deltaTime, elapsed, safeDuration), normalizedTime);
|
||||
clip.action.OnUpdate(CreateContext(deltaTime, elapsed, safeDuration, timeScale, clip.timeSettings), normalizedTime);
|
||||
}
|
||||
break;
|
||||
|
||||
case ClipState.Active:
|
||||
elapsed += deltaTime;
|
||||
|
||||
// 如果启用动态时间缩放,每帧重新获取当前的时间缩放
|
||||
FeedbackTimeSettings settings = clip.overrideTimeSettings ? clip.timeSettings : _data.defaultTimeSettings;
|
||||
float currentTimeScale = timeScale;
|
||||
if (settings.applyDynamicTimeScale)
|
||||
{
|
||||
currentTimeScale = ComputeClipTimeScale(clip);
|
||||
}
|
||||
|
||||
// 使用调整后的deltaTime进行累加
|
||||
float adjustedDeltaTime = deltaTime * currentTimeScale;
|
||||
elapsed += adjustedDeltaTime;
|
||||
|
||||
if (elapsed >= safeDuration)
|
||||
{
|
||||
elapsed = safeDuration;
|
||||
clipState = ClipState.Finished;
|
||||
|
||||
FeedbackContext ctx = CreateContext(deltaTime, elapsed, safeDuration);
|
||||
FeedbackContext ctx = CreateContext(deltaTime, elapsed, safeDuration, currentTimeScale, clip.timeSettings);
|
||||
clip.action.OnUpdate(ctx, 1f);
|
||||
clip.action.OnEnd(ctx);
|
||||
}
|
||||
else
|
||||
{
|
||||
float normalizedTime = Mathf.Clamp01(elapsed / safeDuration);
|
||||
FeedbackContext ctx = CreateContext(deltaTime, elapsed, safeDuration);
|
||||
FeedbackContext ctx = CreateContext(deltaTime, elapsed, safeDuration, currentTimeScale, clip.timeSettings);
|
||||
clip.action.OnUpdate(ctx, normalizedTime);
|
||||
}
|
||||
break;
|
||||
@@ -302,7 +314,7 @@ namespace SLSUtilities.Feedback
|
||||
|
||||
float elapsed = _clipElapsedTimes[trackIdx, clipIdx];
|
||||
float safeDuration = Mathf.Max(clip.duration, MIN_DURATION);
|
||||
FeedbackContext ctx = CreateContext(0f, elapsed, safeDuration);
|
||||
FeedbackContext ctx = CreateContext(0f, elapsed, safeDuration, 1f, clip.timeSettings);
|
||||
clip.action.OnInterrupt(ctx);
|
||||
}
|
||||
|
||||
@@ -311,10 +323,37 @@ namespace SLSUtilities.Feedback
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查所有应播放的 Clip 是否都已完成。
|
||||
/// 用于时间缩放场景下,避免 Clip 尚在播放就提前完成整个 Feedback。
|
||||
/// </summary>
|
||||
private bool AllClipsFinished()
|
||||
{
|
||||
if (_clipStates == null) return true;
|
||||
|
||||
List<FeedbackTrack> tracks = _data.tracks;
|
||||
|
||||
for (int trackIdx = 0; trackIdx < tracks.Count; trackIdx++)
|
||||
{
|
||||
FeedbackTrack track = tracks[trackIdx];
|
||||
if (!ShouldPlayTrack(track)) continue;
|
||||
if (track.clips == null) continue;
|
||||
|
||||
for (int clipIdx = 0; clipIdx < track.clips.Count; clipIdx++)
|
||||
{
|
||||
if (_clipStates[trackIdx, clipIdx] == ClipState.Active)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建 FeedbackContext 实例。
|
||||
/// </summary>
|
||||
private FeedbackContext CreateContext(float deltaTime, float elapsedTime, float duration)
|
||||
private FeedbackContext CreateContext(float deltaTime, float elapsedTime,
|
||||
float duration, float timeScale, FeedbackTimeSettings timeSettings)
|
||||
{
|
||||
return new FeedbackContext
|
||||
{
|
||||
@@ -322,7 +361,9 @@ namespace SLSUtilities.Feedback
|
||||
owner = _ownerTransform,
|
||||
deltaTime = deltaTime,
|
||||
elapsedTime = elapsedTime,
|
||||
duration = duration
|
||||
duration = duration,
|
||||
timeScale = timeScale,
|
||||
timeSettings = timeSettings
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user