From ca85c0a70922aa219f6cad5e8af8ad004c3cb4b3 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期三, 05 十一月 2025 14:36:02 +0800
Subject: [PATCH] 125 战斗 天子血条刷新包

---
 Main/System/Battle/Motion/MotionBase.cs |   95 +++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 90 insertions(+), 5 deletions(-)

diff --git a/Main/System/Battle/Motion/MotionBase.cs b/Main/System/Battle/Motion/MotionBase.cs
index 5be8665..3a21f7c 100644
--- a/Main/System/Battle/Motion/MotionBase.cs
+++ b/Main/System/Battle/Motion/MotionBase.cs
@@ -23,7 +23,12 @@
     protected Spine.Skeleton skeleton;
     protected float defaultMixDuration = 0f;
     private Spine.TrackEntry currentTrack;
-    private Dictionary<int, Spine.TrackEntry> activeSkillTracks = new Dictionary<int, Spine.TrackEntry>(); // 鏀逛负瀛楀吀锛歵rackIndex -> TrackEntry
+    private Dictionary<int, Spine.TrackEntry> activeSkillTracks = new Dictionary<int, Spine.TrackEntry>();
+    
+    // 瀛愭妧鑳借建閬撴睜绠$悊锛堝湪Init涓垵濮嬪寲锛屼笉瑕佸湪杩欓噷鍒濆鍖栵級
+    private Queue<int> availableSubTracks;
+    private Dictionary<SkillBase, int> subSkillTrackMap = new Dictionary<SkillBase, int>();
+    
     private SkeletonIllusionShadow illusionShadow;
     private bool playingSkillAnim = false;
 
@@ -52,6 +57,11 @@
         if (animState != null)
             animState.Data.DefaultMix = defaultMixDuration;
 
+        // 鍒濆鍖栧瓙鎶�鑳借建閬撴睜
+        availableSubTracks = new Queue<int>();
+        for (int i = 1; i <= 8; i++)
+            availableSubTracks.Enqueue(i);
+
         PlayAnimation(MotionName.idle, true);
         SetupAnimationHandlers();
         
@@ -63,6 +73,8 @@
     {
         trackEntryCallbacks.Clear();
         activeSkillTracks.Clear();
+        availableSubTracks?.Clear();
+        subSkillTrackMap.Clear();
         if (animState != null)
         {
             animState.Complete -= OnAnimationComplete;
@@ -109,8 +121,8 @@
             return null;
         }
 
-        // 瀛愭妧鑳藉己鍒朵娇鐢ㄦ棤鍔ㄧ敾妯″紡锛屾垨鑰呭鏋滄病鏈夊姩鐢诲悕绉�
-        if (isSubSkill || string.IsNullOrEmpty(skillConfig.SkillMotionName))
+        // 濡傛灉娌℃湁鍔ㄧ敾鍚嶇О锛屼娇鐢ㄦ棤鍔ㄧ敾妯″紡
+        if (string.IsNullOrEmpty(skillConfig.SkillMotionName))
         {
             PlaySkillNoAnim(skillConfig, skillBase, onComplete, isSubSkill);
             return null;
@@ -136,13 +148,41 @@
         int frameCount = activeFrames.Length;
         float recoveryFrame = skillConfig.RecoveryFrames;
 
-        // 涓绘妧鑳界敤 track 0锛屽瓙鎶�鑳界敤 track 1
-        int trackIndex = isSubSkill ? 1 : 0;
+        // 杞ㄩ亾鍒嗛厤绛栫暐锛氫富鎶�鑳界敤 track 0锛屽瓙鎶�鑳戒粠杞ㄩ亾姹犲垎閰�
+        int trackIndex = 0;
+        if (isSubSkill)
+        {
+            if (availableSubTracks != null && availableSubTracks.Count > 0)
+            {
+                trackIndex = availableSubTracks.Dequeue();
+                subSkillTrackMap[skillBase] = trackIndex;
+            }
+            else
+            {
+                // 杞ㄩ亾姹犺�楀敖鎴栨湭鍒濆鍖栵紝鍥為��鍒版棤鍔ㄧ敾妯″紡
+                Debug.LogWarning($"瀛愭妧鑳借建閬撴睜宸叉弧鎴栨湭鍒濆鍖栵紝鎶�鑳絳skillConfig.SkillID}浣跨敤鏃犲姩鐢绘ā寮�");
+                PlaySkillNoAnim(skillConfig, skillBase, onComplete, isSubSkill);
+                return null;
+            }
+        }
+        
         Spine.TrackEntry skillTrack = null;
         
         if (hasAnim)
         {
             skillTrack = animState.SetAnimation(trackIndex, targetAnim, false);
+            if (null == skillTrack)
+            {
+                Debug.LogError($"鎶�鑳� {skillConfig.SkillID} 鍔ㄧ敾璁剧疆澶辫触");
+                // 濡傛灉鏄瓙鎶�鑳戒笖鍒嗛厤浜嗚建閬擄紝闇�瑕佸洖鏀�
+                if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+                {
+                    if (availableSubTracks != null)
+                        availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+                    subSkillTrackMap.Remove(skillBase);
+                }
+                return null;
+            }
             
             // 鍙湁涓绘妧鑳芥墠鏇存柊 currentTrack
             if (!isSubSkill)
@@ -175,6 +215,14 @@
                 {
                     if (activeSkillTracks[trackIndex] == skillTrack)
                         activeSkillTracks.Remove(trackIndex);
+                }
+                
+                // 鍥炴敹瀛愭妧鑳借建閬�
+                if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+                {
+                    if (availableSubTracks != null)
+                        availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+                    subSkillTrackMap.Remove(skillBase);
                 }
                 
                 // 鍙湁褰撴病鏈夊叾浠栨椿璺冩妧鑳芥椂鎵嶅浣� playingSkillAnim
@@ -214,6 +262,15 @@
 
                     // 娓呯悊骞剁‘淇濈姸鎬佸浣�
                     RemoveAction(frameHandler);
+                    
+                    // 鍥炴敹瀛愭妧鑳借建閬�
+                    if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+                    {
+                        if (availableSubTracks != null)
+                            availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+                        subSkillTrackMap.Remove(skillBase);
+                    }
+                    
                     if (activeSkillTracks.Count == 0)
                         playingSkillAnim = false;
                     return;
@@ -227,6 +284,15 @@
                     RemoveAction(frameHandler);
                     if (activeSkillTracks.ContainsKey(trackIndex))
                         activeSkillTracks.Remove(trackIndex);
+                    
+                    // 鍥炴敹瀛愭妧鑳借建閬�
+                    if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+                    {
+                        if (availableSubTracks != null)
+                            availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+                        subSkillTrackMap.Remove(skillBase);
+                    }
+                    
                     if (activeSkillTracks.Count == 0)
                         playingSkillAnim = false;
                     return;
@@ -303,6 +369,14 @@
                     {
                         if (activeSkillTracks[trackIndex] == skillTrack)
                             activeSkillTracks.Remove(trackIndex);
+                    }
+
+                    // 鍥炴敹瀛愭妧鑳借建閬�
+                    if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+                    {
+                        if (availableSubTracks != null)
+                            availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+                        subSkillTrackMap.Remove(skillBase);
                     }
 
                     // 鍙湁褰撴病鏈夊叾浠栨椿璺冩妧鑳芥椂鎵嶅浣� playingSkillAnim
@@ -436,6 +510,17 @@
         trackEntryCallbacks.Clear();
         runningActions.Clear();
         activeSkillTracks.Clear();
+        
+        // 閲嶇疆瀛愭妧鑳借建閬撴睜
+        if (availableSubTracks == null)
+            availableSubTracks = new Queue<int>();
+        else
+            availableSubTracks.Clear();
+            
+        subSkillTrackMap.Clear();
+        for (int i = 1; i <= 8; i++)
+            availableSubTracks.Enqueue(i);
+        
         playingSkillAnim = false;
         PlayAnimation(MotionName.idle, true);
     }

--
Gitblit v1.8.0