From 8f983d0dab26becb6b85dbbb616fde21c3ad8f02 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期三, 20 八月 2025 18:40:23 +0800
Subject: [PATCH] 125 【战斗】战斗系统

---
 Main/System/Battle/Motion/MotionBase.cs |  149 ++++++++++++++++++++++++++++++++++---------------
 1 files changed, 102 insertions(+), 47 deletions(-)

diff --git a/Main/System/Battle/Motion/MotionBase.cs b/Main/System/Battle/Motion/MotionBase.cs
index 99e5e3b..1e5b32f 100644
--- a/Main/System/Battle/Motion/MotionBase.cs
+++ b/Main/System/Battle/Motion/MotionBase.cs
@@ -10,7 +10,7 @@
 /// </summary>
 public class MotionBase
 {
-    public static float MotionTimeScale = 2f;
+    public static float MotionTimeScale = 1f;
 
     public static List<string> AttackMotionList = new List<string>
     {
@@ -133,88 +133,143 @@
         return currentTrackEntry;
     }
 
-    public Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, Action onComplete = null, Action onBeginPhaseEnd = null, Action onActivePhaseEnd = null)
+    public Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, Action _onComplete = null)
     {
+        // 鍙傛暟鏍¢獙
         if (skillConfig == null)
         {
             Debug.LogError("鎶�鑳介厤缃负绌猴紝鏃犳硶鎾斁鎶�鑳藉姩鐢�");
             return null;
         }
+        if (spineAnimationState == null || skeleton == null)
+        {
+            Debug.LogError("SkeletonGraphic鎴朅nimationState鏈垵濮嬪寲锛屾棤娉曟挱鏀炬妧鑳藉姩鐢�");
+            return null;
+        }
 
-        return PlayAnimation(skillConfig.SkillMotionName, skillConfig.StartupFrames, skillConfig.ActiveFrames, skillConfig.LoopCount,
-            onComplete, onBeginPhaseEnd, onActivePhaseEnd);
-    }
+        // 鑾峰彇鍔ㄧ敾
+        Spine.Animation anim = skeleton.Data.FindAnimation(skillConfig.SkillMotionName);
+        if (anim == null)
+        {
+            Debug.LogError($"鎵句笉鍒板姩鐢�: {skillConfig.SkillMotionName}");
+            return null;
+        }
 
-    public virtual Spine.TrackEntry PlayAnimation(
-            string animationName,
-            int loopBeginFrame,
-            int loopEndFrame,
-            int loopTimes,
-            Action _onComplete = null,
-            Action onBeginPhaseEnd = null,    // 鍓嶆憞缁撴潫鍥炶皟
-            Action onActivePhaseEnd = null    // 涓憞缁撴潫鍥炶皟
-        )
-    {
-        if (spineAnimationState == null || skeleton == null) return null;
-
-        var anim = skeleton.Data.FindAnimation(animationName);
-        if (anim == null) return null;
-
+        // 鍏抽敭甯у弬鏁�
         float fps = BattleConst.skillMotionFps;
-        float beginTime = loopBeginFrame / fps;
-        float endTime = loopEndFrame / fps;
+        float middleBeginTime = skillConfig.StartupFrames / fps;
+        int loopCount = skillConfig.LoopCount;
+        int[] activeFrames = skillConfig.ActiveFrames;
+        int activeFrameCount = activeFrames.Length;
+        float recoveryFrameTime = skillConfig.RecoveryFrames / fps;
 
-        currentTrackEntry = spineAnimationState.SetAnimation(0, anim, false);
+        // 鎾斁鍔ㄧ敾
+        var skillTrackEntry = spineAnimationState.SetAnimation(0, anim, false);
+        currentTrackEntry = skillTrackEntry;
 
+        // 浜嬩欢鐘舵��
         int curLoop = 0;
-        bool finished = false;
+        bool isFinish = false;
         bool beginPhaseTriggered = false;
+        bool finalFrameStarted = false;
+        bool finalFrameEnded = false;
+        bool middleFrameStarted = false;
+        bool[] triggeredActiveFrame = new bool[activeFrameCount];
 
+        // 鎶�鑳藉紑濮�
+        skillBase.OnSkillStart();
+
+        // 鍔ㄧ敾甯ф洿鏂板鐞�
         Spine.Unity.UpdateBonesDelegate updateLocalHandler = null;
         updateLocalHandler = (ISkeletonAnimation animated) =>
         {
-            if (finished) return;
-            var entry = currentTrackEntry;
-            if (entry == null || entry.Animation != anim)
-            {
-                skeletonGraphic.UpdateLocal -= updateLocalHandler;
-                return;
-            }
+            if (isFinish) return;
+            float trackTime = skillTrackEntry.TrackTime;
 
             // 鍓嶆憞缁撴潫锛堝彧瑙﹀彂涓�娆★級
-            if (!beginPhaseTriggered && entry.TrackTime >= beginTime)
+            if (!beginPhaseTriggered && trackTime >= middleBeginTime && curLoop == 0)
             {
                 beginPhaseTriggered = true;
-                onBeginPhaseEnd?.Invoke();
+                skillBase.OnStartSkillFrameEnd();
             }
 
-            // 涓憞缁撴潫锛堟瘡娆″埌endTime閮借Е鍙戯級
-            if (entry.TrackTime >= endTime)
+            // 涓憞寮�濮嬶紙姣忚疆loop鐨勫紑濮嬶紝鍙Е鍙戜竴娆★級
+            if (!middleFrameStarted && trackTime >= middleBeginTime && curLoop < loopCount)
             {
-                onActivePhaseEnd?.Invoke();
+                middleFrameStarted = true;
+                skillBase.OnMiddleFrameStart(curLoop);
+            }
 
-                curLoop++;
-                if (curLoop >= loopTimes)
+            // 澶氭鏀诲嚮甯цЕ鍙�
+            for (int hitIndex = 0; hitIndex < activeFrameCount; hitIndex++)
+            {
+                float activeFrameTime = activeFrames[hitIndex] / fps;
+                if (!triggeredActiveFrame[hitIndex] && trackTime >= activeFrameTime)
                 {
-                    finished = true;
-                    skeletonGraphic.UpdateLocal -= updateLocalHandler;
-                    _onComplete?.Invoke();
-                    return;
+                    skillBase.OnMiddleFrameEnd(curLoop, hitIndex);
+                    triggeredActiveFrame[hitIndex] = true;
                 }
-                entry.TrackTime = beginTime;
-                beginPhaseTriggered = false; // 閲嶇疆锛屼笅涓�杞墠鎽囧彲鍐嶆瑙﹀彂
+            }
+
+            // 鍒ゆ柇鏄惁鎵�鏈塧ctiveFrame閮藉凡瑙﹀彂锛屽噯澶囪繘鍏ヤ笅涓�杞甽oop
+            bool allTriggered = true;
+            for (int i = 0; i < activeFrameCount; i++)
+            {
+                if (!triggeredActiveFrame[i])
+                {
+                    allTriggered = false;
+                    break;
+                }
+            }
+
+            // 杩涘叆涓嬩竴杞甽oop
+            if (allTriggered && curLoop < loopCount)
+            {
+                curLoop++;
+                Array.Clear(triggeredActiveFrame, 0, activeFrameCount);
+                middleFrameStarted = false;
+
+                if (curLoop < loopCount)
+                {
+                    // 閲嶆柊璁剧疆鍒扮涓�娆$殑涓憞鏃堕棿
+                    skillTrackEntry.TrackTime = middleBeginTime;
+                    beginPhaseTriggered = false;
+                }
+                else
+                {
+                    finalFrameStarted = false;
+                    finalFrameEnded = false;
+                    // 鏀跺熬闃舵鐢卞悗缁�昏緫澶勭悊
+                }
+            }
+
+            // 鏀跺熬闃舵锛歄nFinalFrameStart 鍜� OnFinalFrameEnd
+            if (curLoop >= loopCount)
+            {
+                if (!finalFrameStarted && trackTime >= recoveryFrameTime)
+                {
+                    finalFrameStarted = true;
+                    skillBase.OnFinalFrameStart();
+                }
+                if (finalFrameStarted && !finalFrameEnded && trackTime >= recoveryFrameTime)
+                {
+                    finalFrameEnded = true;
+                    skillBase.OnFinalFrameEnd();
+                    skeletonGraphic.UpdateLocal -= updateLocalHandler;
+                    isFinish = true;
+                }
             }
         };
-        skeletonGraphic.UpdateLocal += updateLocalHandler;
 
         if (_onComplete != null && currentTrackEntry != null)
         {
             trackEntryCompleteDict[currentTrackEntry] = _onComplete;
         }
 
-        return currentTrackEntry;
+        skeletonGraphic.UpdateLocal += updateLocalHandler;
+        return skillTrackEntry;
     }
-    
+
     
     /// <summary>
     /// 璁剧疆鍔ㄧ敾浜嬩欢鐩戝惉

--
Gitblit v1.8.0