| | |
| | | private bool isUnderControl = false; |
| | | |
| | | private float pauseTime = 0f; |
| | | |
| | | private float resumeTime = 0f; |
| | | |
| | | // 新增:累积暂停时长,用于对非动画路径(Time.time)进行稳定的时间修正 |
| | | private float pausedAccumulated = 0f; |
| | | private float pauseStart = 0f; |
| | | |
| | | public virtual void Init(SkeletonAnimation skelAnim) |
| | | { |
| | |
| | | int currentLoop = 0, triggerCount = 0, failCount = 0; |
| | | bool beginTriggered = false, finalStarted = false, finalEnded = false, middleStarted = false; |
| | | bool[] triggeredFrames = new bool[frameCount]; |
| | | float startTime = hasAnim ? 0 : Time.time; |
| | | |
| | | // 新增:记录技能开始时的 pausedAccumulated 基线,用于后续计算该技能自身的暂停时长 |
| | | float pausedAccumulatedAtStart = pausedAccumulated; |
| | | |
| | | // startTime 表示技能“本地逻辑时间”的起点(以 Time.time 为基准) |
| | | float startTime = hasAnim ? 0f : Time.time; |
| | | |
| | | skillBase.OnSkillStart(); |
| | | |
| | |
| | | { |
| | | if (skillBase.IsFinished()) |
| | | { |
| | | // 清理并退出(保证状态一致) |
| | | playingSkillAnim = false; |
| | | RemoveAction(frameHandler); |
| | | return; |
| | | } |
| | | |
| | | float trackTime = 0f; //hasAnim ? skillTrack.TrackTime * skillTrack.TimeScale : (Time.time - startTime) * MotionTimeScale; |
| | | float trackTime = 0f; |
| | | |
| | | if (hasAnim) |
| | | { |
| | |
| | | } |
| | | else |
| | | { |
| | | // 使用 pausedAccumulatedAtStart 来计算“这个技能自开始以来的暂停总时长” |
| | | float adjustedTime = Time.time; |
| | | if (pauseTime > 0f && resumeTime > pauseTime) |
| | | { |
| | | startTime = startTime + (resumeTime - pauseTime); |
| | | pauseTime = 0f; |
| | | resumeTime = 0f; |
| | | } |
| | | trackTime = (adjustedTime - startTime) * MotionTimeScale; |
| | | float thisSkillPaused = pausedAccumulated - pausedAccumulatedAtStart; |
| | | if (thisSkillPaused < 0f) thisSkillPaused = 0f; // 保险防护 |
| | | |
| | | // 逻辑运行时间 = 当前时间 - startTime - 本技能已暂停时长 |
| | | trackTime = (adjustedTime - startTime - thisSkillPaused) * MotionTimeScale; |
| | | } |
| | | |
| | | float currentFrame = trackTime * BattleConst.skillMotionFps; |
| | |
| | | { |
| | | Debug.LogError("技能动画被打断,强制结束 " + skillConfig.SkillID); |
| | | skillBase.ForceFinished(); |
| | | |
| | | // 清理并确保状态复位 |
| | | RemoveAction(frameHandler); |
| | | playingSkillAnim = false; |
| | | return; |
| | |
| | | } |
| | | } |
| | | |
| | | // 各阶段回调(原有逻辑) |
| | | if (!beginTriggered && currentFrame >= skillConfig.StartupFrames && currentLoop == 0) |
| | | { |
| | | beginTriggered = true; |
| | |
| | | if (BattleConst.skillMotionFps > 0) |
| | | { |
| | | if (hasAnim) |
| | | { |
| | | skillTrack.TrackTime = skillConfig.StartupFrames / BattleConst.skillMotionFps; |
| | | } |
| | | else |
| | | { |
| | | // 为下一 loop 重置 startTime,并且更新 pausedAccumulatedAtStart(以保持基线) |
| | | startTime = Time.time - (skillConfig.StartupFrames / BattleConst.skillMotionFps); |
| | | pausedAccumulatedAtStart = pausedAccumulated; |
| | | } |
| | | } |
| | | beginTriggered = false; |
| | | } |
| | |
| | | if (finalStarted && !finalEnded && currentFrame >= recoveryFrame) |
| | | { |
| | | finalEnded = true; |
| | | if (!isSubSkill) |
| | | { |
| | | |
| | | // 一定要把 playingSkillAnim 复位(无论是否是子技能),否则可能导致后续动画被拦截 |
| | | playingSkillAnim = false; |
| | | } |
| | | |
| | | RemoveAction(frameHandler); |
| | | onComplete?.Invoke(); |
| | | skillBase.OnFinalFrameEnd(); |
| | |
| | | public virtual void Pause() |
| | | { |
| | | if (skeletonAnim != null) skeletonAnim.timeScale = 0f; |
| | | |
| | | // 记录单次暂停开始时刻 |
| | | pauseStart = Time.time; |
| | | // 兼容旧字段(保留但不再用于累积逻辑) |
| | | pauseTime = Time.time; |
| | | } |
| | | |
| | | public virtual void Resume() |
| | | { |
| | | if (skeletonAnim != null) skeletonAnim.timeScale = MotionTimeScale; |
| | | |
| | | // 累积暂停时长(如果曾记录过 pauseStart) |
| | | if (pauseStart > 0f) |
| | | { |
| | | pausedAccumulated += (Time.time - pauseStart); |
| | | pauseStart = 0f; |
| | | } |
| | | |
| | | // 保持旧字段以兼容现有代码(但实际时间修正使用 pausedAccumulated) |
| | | resumeTime = Time.time; |
| | | } |
| | | |