|  |  | 
 |  |  |     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 (skillTrack.TrackTime == 0) failCount++; | 
 |  |  |                 if (failCount > 100) | 
 |  |  |                 { | 
 |  |  | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 各阶段回调(原有逻辑) | 
 |  |  |             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 = false; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 一定要把 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; | 
 |  |  |     } | 
 |  |  |  |