From 11ff5f8f5ef2a8dfc1bff5a657375148044d05c0 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期四, 30 十月 2025 18:59:50 +0800
Subject: [PATCH] 125 战斗 修复子技能因为暂停而导致的卡死
---
 Main/System/Battle/Motion/MotionBase.cs |   60 +++++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 45 insertions(+), 15 deletions(-)
diff --git a/Main/System/Battle/Motion/MotionBase.cs b/Main/System/Battle/Motion/MotionBase.cs
index 5a29950..1b0fe44 100644
--- a/Main/System/Battle/Motion/MotionBase.cs
+++ b/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;
+        }
+
+        // 淇濇寔鏃у瓧娈典互鍏煎鐜版湁浠g爜锛堜絾瀹為檯鏃堕棿淇浣跨敤 pausedAccumulated锛�
         resumeTime = Time.time;
     }
 
--
Gitblit v1.8.0