yyl
5 天以前 11ff5f8f5ef2a8dfc1bff5a657375148044d05c0
125 战斗 修复子技能因为暂停而导致的卡死
1个文件已修改
60 ■■■■ 已修改文件
Main/System/Battle/Motion/MotionBase.cs 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Motion/MotionBase.cs
@@ -29,8 +29,11 @@
    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)
    {
@@ -142,7 +145,12 @@
        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();
@@ -151,12 +159,13 @@
        {
            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)
            {
@@ -164,14 +173,13 @@
            }
            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;
@@ -182,11 +190,13 @@
                {
                    Debug.LogError("技能动画被打断,强制结束 " + skillConfig.SkillID);
                    skillBase.ForceFinished();
                    // 清理并确保状态复位
                    RemoveAction(frameHandler);
                    playingSkillAnim = false;
                    return;
                }
                if (skillTrack.TrackTime == 0) failCount++;
                if (failCount > 100)
                {
@@ -198,6 +208,7 @@
                }
            }
            // 各阶段回调(原有逻辑)
            if (!beginTriggered && currentFrame >= skillConfig.StartupFrames && currentLoop == 0)
            {
                beginTriggered = true;
@@ -232,9 +243,15 @@
                    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;
                }
@@ -255,10 +272,10 @@
                if (finalStarted && !finalEnded && currentFrame >= recoveryFrame)
                {
                    finalEnded = true;
                    if (!isSubSkill)
                    {
                        playingSkillAnim = false;
                    }
                    // 一定要把 playingSkillAnim 复位(无论是否是子技能),否则可能导致后续动画被拦截
                    playingSkillAnim = false;
                    RemoveAction(frameHandler);
                    onComplete?.Invoke();
                    skillBase.OnFinalFrameEnd();
@@ -359,12 +376,25 @@
    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;
    }