From eb27e5fd31f73b998a4bbd85511a31e40b8c61b7 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期五, 21 十一月 2025 17:03:47 +0800
Subject: [PATCH] 0312 关闭游戏内日志

---
 Main/System/Battle/Motion/MotionBase.cs |  174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 164 insertions(+), 10 deletions(-)

diff --git a/Main/System/Battle/Motion/MotionBase.cs b/Main/System/Battle/Motion/MotionBase.cs
index 1b0fe44..9539668 100644
--- a/Main/System/Battle/Motion/MotionBase.cs
+++ b/Main/System/Battle/Motion/MotionBase.cs
@@ -23,6 +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>();
+    
+    // 瀛愭妧鑳借建閬撴睜绠$悊锛堝湪Init涓垵濮嬪寲锛屼笉瑕佸湪杩欓噷鍒濆鍖栵級
+    private Queue<int> availableSubTracks;
+    private Dictionary<SkillBase, int> subSkillTrackMap = new Dictionary<SkillBase, int>();
+    
     private SkeletonIllusionShadow illusionShadow;
     private bool playingSkillAnim = false;
 
@@ -51,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();
         
@@ -61,6 +72,9 @@
     public virtual void Release()
     {
         trackEntryCallbacks.Clear();
+        activeSkillTracks.Clear();
+        availableSubTracks?.Clear();
+        subSkillTrackMap.Clear();
         if (animState != null)
         {
             animState.Complete -= OnAnimationComplete;
@@ -91,6 +105,41 @@
         return currentTrack;
     }
 
+    public virtual Spine.TrackEntry PlayDeadAnimation(Action onComplete = null)
+    {
+        if (animState == null) return null;
+        
+        // 浣跨敤杞ㄩ亾9浣滀负姝讳骸鍔ㄧ敾涓撶敤杞ㄩ亾锛堢嫭绔嬩簬涓昏建閬�0鍜屽瓙鎶�鑳借建閬�1-8锛�
+        const int deathTrackIndex = 9;
+        
+        // 娓呴櫎姝讳骸杞ㄩ亾涓婄殑鍥炶皟
+        if (activeSkillTracks.TryGetValue(deathTrackIndex, out var oldDeathTrack))
+        {
+            if (trackEntryCallbacks.ContainsKey(oldDeathTrack))
+                trackEntryCallbacks.Remove(oldDeathTrack);
+        }
+        
+        Spine.Animation deadAnim = FindAnim(MotionName.dead.ToString());
+        if (deadAnim == null)
+        {
+            Debug.LogError("鎵句笉鍒版浜″姩鐢�");
+            onComplete?.Invoke();
+            return null;
+        }
+        
+        Spine.TrackEntry deathTrack = animState.SetAnimation(deathTrackIndex, deadAnim, false);
+        
+        if (deathTrack != null)
+        {
+            activeSkillTracks[deathTrackIndex] = deathTrack;
+            
+            if (onComplete != null)
+                trackEntryCallbacks[deathTrack] = onComplete;
+        }
+        
+        return deathTrack;
+    }
+
     private void AddAction(Action action) => runningActions.Add(action);
     private void RemoveAction(Action action) => runningActions.Remove(action);
 
@@ -107,6 +156,7 @@
             return null;
         }
 
+        // 濡傛灉娌℃湁鍔ㄧ敾鍚嶇О锛屼娇鐢ㄦ棤鍔ㄧ敾妯″紡
         if (string.IsNullOrEmpty(skillConfig.SkillMotionName))
         {
             PlaySkillNoAnim(skillConfig, skillBase, onComplete, isSubSkill);
@@ -133,11 +183,47 @@
         int frameCount = activeFrames.Length;
         float recoveryFrame = skillConfig.RecoveryFrames;
 
+        // 杞ㄩ亾鍒嗛厤绛栫暐锛氫富鎶�鑳界敤 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(0, targetAnim, false);
-            currentTrack = skillTrack;
+            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)
+                currentTrack = skillTrack;
+            
+            activeSkillTracks[trackIndex] = skillTrack;
         }
         
         playingSkillAnim = true;
@@ -149,7 +235,7 @@
         // 鏂板锛氳褰曟妧鑳藉紑濮嬫椂鐨� pausedAccumulated 鍩虹嚎锛岀敤浜庡悗缁绠楄鎶�鑳借嚜韬殑鏆傚仠鏃堕暱
         float pausedAccumulatedAtStart = pausedAccumulated;
 
-        // startTime 琛ㄧず鎶�鑳解�滄湰鍦伴�昏緫鏃堕棿鈥濈殑璧风偣锛堜互 Time.time 涓哄熀鍑嗭級
+        // startTime 琛ㄧず鎶�鑳�"鏈湴閫昏緫鏃堕棿"鐨勮捣鐐癸紙浠� Time.time 涓哄熀鍑嗭級
         float startTime = hasAnim ? 0f : Time.time;
 
         skillBase.OnSkillStart();
@@ -160,7 +246,24 @@
             if (skillBase.IsFinished())
             {
                 // 娓呯悊骞堕��鍑猴紙淇濊瘉鐘舵�佷竴鑷达級
-                playingSkillAnim = false;
+                if (skillTrack != null && activeSkillTracks.ContainsKey(trackIndex))
+                {
+                    if (activeSkillTracks[trackIndex] == skillTrack)
+                        activeSkillTracks.Remove(trackIndex);
+                }
+                
+                // 鍥炴敹瀛愭妧鑳借建閬�
+                if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+                {
+                    if (availableSubTracks != null)
+                        availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+                    subSkillTrackMap.Remove(skillBase);
+                }
+                
+                // 鍙湁褰撴病鏈夊叾浠栨椿璺冩妧鑳芥椂鎵嶅浣� playingSkillAnim
+                if (activeSkillTracks.Count == 0)
+                    playingSkillAnim = false;
+                
                 RemoveAction(frameHandler);
                 return;
             }
@@ -173,7 +276,7 @@
             }
             else
             {
-                // 浣跨敤 pausedAccumulatedAtStart 鏉ヨ绠椻�滆繖涓妧鑳借嚜寮�濮嬩互鏉ョ殑鏆傚仠鎬绘椂闀库��
+                // 浣跨敤 pausedAccumulatedAtStart 鏉ヨ绠�"杩欎釜鎶�鑳借嚜寮�濮嬩互鏉ョ殑鏆傚仠鎬绘椂闀�"
                 float adjustedTime = Time.time;
                 float thisSkillPaused = pausedAccumulated - pausedAccumulatedAtStart;
                 if (thisSkillPaused < 0f) thisSkillPaused = 0f; // 淇濋櫓闃叉姢
@@ -186,14 +289,25 @@
 
             if (hasAnim)
             {
-                if (currentTrack != skillTrack)
+                // 妫�鏌ュ綋鍓嶈建閬撴槸鍚﹁鏂版妧鑳借鐩�
+                if (!activeSkillTracks.ContainsKey(trackIndex) || activeSkillTracks[trackIndex] != skillTrack)
                 {
                     Debug.LogError("鎶�鑳藉姩鐢昏鎵撴柇锛屽己鍒剁粨鏉� " + skillConfig.SkillID);
                     skillBase.ForceFinished();
 
                     // 娓呯悊骞剁‘淇濈姸鎬佸浣�
                     RemoveAction(frameHandler);
-                    playingSkillAnim = false;
+                    
+                    // 鍥炴敹瀛愭妧鑳借建閬�
+                    if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+                    {
+                        if (availableSubTracks != null)
+                            availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+                        subSkillTrackMap.Remove(skillBase);
+                    }
+                    
+                    if (activeSkillTracks.Count == 0)
+                        playingSkillAnim = false;
                     return;
                 }
 
@@ -203,7 +317,19 @@
                     Debug.LogError("鎶�鑳藉姩鐢绘挱鏀惧け璐ワ紝寮哄埗缁撴潫 " + skillConfig.SkillID);
                     skillBase.ForceFinished();
                     RemoveAction(frameHandler);
-                    playingSkillAnim = false;
+                    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;
                 }
             }
@@ -273,8 +399,24 @@
                 {
                     finalEnded = true;
 
-                    // 涓�瀹氳鎶� playingSkillAnim 澶嶄綅锛堟棤璁烘槸鍚︽槸瀛愭妧鑳斤級锛屽惁鍒欏彲鑳藉鑷村悗缁姩鐢昏鎷︽埅
-                    playingSkillAnim = false;
+                    // 娓呯悊鎶�鑳借建閬�
+                    if (skillTrack != null && activeSkillTracks.ContainsKey(trackIndex))
+                    {
+                        if (activeSkillTracks[trackIndex] == skillTrack)
+                            activeSkillTracks.Remove(trackIndex);
+                    }
+
+                    // 鍥炴敹瀛愭妧鑳借建閬�
+                    if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+                    {
+                        if (availableSubTracks != null)
+                            availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+                        subSkillTrackMap.Remove(skillBase);
+                    }
+
+                    // 鍙湁褰撴病鏈夊叾浠栨椿璺冩妧鑳芥椂鎵嶅浣� playingSkillAnim
+                    if (activeSkillTracks.Count == 0)
+                        playingSkillAnim = false;
 
                     RemoveAction(frameHandler);
                     onComplete?.Invoke();
@@ -402,6 +544,18 @@
     {
         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