From ed9bf64c03bf5fee5e115645de5a975baaa9041d Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期五, 09 一月 2026 11:04:53 +0800
Subject: [PATCH] 125 战斗 修改死亡表现 带动作的子技能同时触发导致的卡死

---
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs |  271 ++++++++++++++++++++
 Main/System/Battle/Motion/MotionBase.cs                                                     |   29 ++
 Main/System/Battle/BattleField/BattleField.cs                                               |   12 
 Main/System/Battle/RecordPlayer/RecordAction.cs                                             |  121 +++++++++
 Main/System/Battle/RecordPlayer/RecordPlayer.cs                                             |   69 ++++
 Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs                          |    7 
 Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs                             |    6 
 Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs                           |    6 
 Main/System/Battle/BattleObject/BattleObject.cs                                             |    4 
 Main/System/Battle/Skill/SkillBase.cs                                                       |  122 ++++++++-
 Main/System/Battle/BattleField/RecordActions/RoundChangeAction.cs                           |    7 
 Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs                           |   73 +++++
 Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs                           |   47 +++
 13 files changed, 743 insertions(+), 31 deletions(-)

diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs
index c072818..f3ee457 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs
@@ -86,6 +86,10 @@
                 }
             }
 #if UNITY_EDITOR
+            //  瑙f瀽鎵�鏈塿PackList閲岀殑姣忎釜瀛楁锛堟繁搴︼級骞朵笖杈撳嚭鍒癆pplication.dataPath + "/../BattleReport/PackageDetailAnalysis_鏃堕棿鎴�.txt鏂囦欢閲�
+
+
+
             string originPack = string.Empty;
             BattleField battleField = BattleManager.Instance.GetBattleField(guid);
 
@@ -172,7 +176,23 @@
             }
 #endif
 
-
+#region Start Print Pack List Detail
+            if (Launch.Instance.isOpenSkillLogFile)
+            {
+                try
+                {
+                    string detailAnalysis = PrintPackageDetailAnalysis(vPackList, guid);
+                    string filePath = Application.dataPath + "/../BattleReport/PackageDetailAnalysis_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt";
+                    System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(filePath));
+                    System.IO.File.WriteAllText(filePath, detailAnalysis);
+                    Debug.Log("鍖呰缁嗗垎鏋愬凡淇濆瓨鍒�: " + filePath);
+                }
+                catch (Exception e)
+                {
+                    Debug.LogError("淇濆瓨鍖呰缁嗗垎鏋愬け璐�: " + e.Message);
+                }
+            }
+#endregion 
 
             for (int i = 0; i < vPackList.Count; i++)
             {
@@ -571,4 +591,253 @@
         }
         return returnList;
     }
+
+#if UNITY_EDITOR
+    /// <summary>
+    /// 娣卞害瑙f瀽鍖呭垪琛ㄤ腑鐨勬墍鏈夊瓧娈�
+    /// </summary>
+    private string PrintPackageDetailAnalysis(List<GameNetPackBasic> packList, string guid)
+    {
+        StringBuilder sb = new StringBuilder();
+        sb.AppendLine("=====================================================");
+        sb.AppendLine("鎴樻姤鍖呰缁嗗垎鏋� - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+        sb.AppendLine("GUID: " + guid);
+        sb.AppendLine("鍖呮�绘暟: " + packList.Count);
+        sb.AppendLine("=====================================================\n");
+
+        BattleField battleField = BattleManager.Instance.GetBattleField(guid);
+
+        for (int i = 0; i < packList.Count; i++)
+        {
+            sb.AppendLine($"銆愬寘 #{i}銆� ==========================================");
+            PrintObjectDetail(sb, packList[i], 0, battleField, new HashSet<object>());
+            sb.AppendLine();
+        }
+
+        return sb.ToString();
+    }
+
+    /// <summary>
+    /// 閫掑綊鎵撳嵃瀵硅薄鐨勬墍鏈夊瓧娈靛拰灞炴��
+    /// </summary>
+    private void PrintObjectDetail(StringBuilder sb, object obj, int indent, BattleField battleField, HashSet<object> visitedObjects)
+    {
+        if (obj == null)
+        {
+            sb.AppendLine(GetIndent(indent) + "null");
+            return;
+        }
+
+        Type type = obj.GetType();
+        string indentStr = GetIndent(indent);
+
+        // 闃叉寰幆寮曠敤
+        if (visitedObjects.Contains(obj))
+        {
+            sb.AppendLine(indentStr + $"<寰幆寮曠敤: {type.Name}>");
+            return;
+        }
+
+        // 鍩烘湰绫诲瀷鍜屽瓧绗︿覆鐩存帴杈撳嚭
+        if (type.IsPrimitive || type == typeof(string) || type == typeof(decimal))
+        {
+            sb.AppendLine(indentStr + obj.ToString());
+            return;
+        }
+
+        // 鏋氫妇绫诲瀷
+        if (type.IsEnum)
+        {
+            sb.AppendLine(indentStr + $"{obj} ({(int)obj})");
+            return;
+        }
+
+        // 娣诲姞鍒板凡璁块棶闆嗗悎锛堜粎瀵瑰紩鐢ㄧ被鍨嬶級
+        if (!type.IsValueType)
+        {
+            visitedObjects.Add(obj);
+        }
+
+        // 杈撳嚭绫诲瀷鍚�
+        sb.AppendLine(indentStr + $"[{type.Name}]");
+
+        // 澶勭悊鏁扮粍
+        if (type.IsArray)
+        {
+            Array array = obj as Array;
+            sb.AppendLine(indentStr + $"Length: {array.Length}");
+            
+            if (array.Length > 0)
+            {
+                for (int i = 0; i < array.Length; i++)
+                {
+                    sb.AppendLine(indentStr + $"  [{i}]:");
+                    PrintObjectDetail(sb, array.GetValue(i), indent + 2, battleField, visitedObjects);
+                }
+            }
+            return;
+        }
+
+        // 澶勭悊List銆丠ashSet绛夐泦鍚�
+        if (obj is System.Collections.IEnumerable && !(obj is string))
+        {
+            var enumerable = obj as System.Collections.IEnumerable;
+            int count = 0;
+            var enumerator = enumerable.GetEnumerator();
+            while (enumerator.MoveNext()) count++;
+            
+            sb.AppendLine(indentStr + $"Count: {count}");
+            
+            if (count > 0)
+            {
+                int index = 0;
+                foreach (var item in enumerable)
+                {
+                    sb.AppendLine(indentStr + $"  [{index}]:");
+                    PrintObjectDetail(sb, item, indent + 2, battleField, visitedObjects);
+                    index++;
+                }
+            }
+            return;
+        }
+
+        // 鑾峰彇鎵�鏈夊叕鍏卞瓧娈�
+        var fields = type.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
+        
+        foreach (var field in fields)
+        {
+            // 璺宠繃Unity鍜孲ystem搴撶殑澶嶆潅绫诲瀷锛堜絾淇濈暀鍩烘湰绫诲瀷锛�
+            Type fieldType = field.FieldType;
+            if (ShouldSkipType(fieldType))
+            {
+                continue;
+            }
+
+            try
+            {
+                object value = field.GetValue(obj);
+                
+                // 鐗规畩澶勭悊锛氭樉绀篛bjID瀵瑰簲鐨勬灏嗗悕瀛�
+                if (field.Name == "ObjID" && value is uint objId && battleField != null)
+                {
+                    var battleObj = battleField.battleObjMgr.GetBattleObject((int)objId);
+                    string heroName = battleObj?.teamHero?.name ?? "Unknown";
+                    sb.AppendLine(indentStr + $"  {field.Name} ({fieldType.Name}): {value} [{heroName}]");
+                }
+                // 鐗规畩澶勭悊锛氭樉绀篠killID瀵瑰簲鐨勬妧鑳藉悕瀛�
+                else if (field.Name == "SkillID" && value is uint skillId)
+                {
+                    string skillName = SkillConfig.Get((int)skillId)?.SkillName ?? "Unknown";
+                    sb.AppendLine(indentStr + $"  {field.Name} ({fieldType.Name}): {value} [{skillName}]");
+                }
+                // 鐗规畩澶勭悊锛氭樉绀篐eroID瀵瑰簲鐨勮嫳闆勫悕瀛�
+                else if (field.Name == "HeroID" && value is uint heroId)
+                {
+                    string heroName = HeroConfig.Get((int)heroId)?.Name ?? "Unknown";
+                    sb.AppendLine(indentStr + $"  {field.Name} ({fieldType.Name}): {value} [{heroName}]");
+                }
+                else if (IsSimpleType(fieldType))
+                {
+                    sb.AppendLine(indentStr + $"  {field.Name} ({fieldType.Name}): {value}");
+                }
+                else
+                {
+                    sb.AppendLine(indentStr + $"  {field.Name} ({fieldType.Name}):");
+                    PrintObjectDetail(sb, value, indent + 2, battleField, visitedObjects);
+                }
+            }
+            catch (Exception e)
+            {
+                sb.AppendLine(indentStr + $"  {field.Name}: <瑙f瀽閿欒: {e.Message}>");
+            }
+        }
+
+        // 鑾峰彇鎵�鏈夊叕鍏卞睘鎬�
+        var properties = type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
+        
+        foreach (var prop in properties)
+        {
+            // 璺宠繃绱㈠紩鍣�
+            if (prop.GetIndexParameters().Length > 0)
+            {
+                continue;
+            }
+
+            // 璺宠繃Unity鍜孲ystem搴撶殑澶嶆潅绫诲瀷
+            Type propType = prop.PropertyType;
+            if (ShouldSkipType(propType))
+            {
+                continue;
+            }
+
+            // 鍙鍙栨湁getter鐨勫睘鎬�
+            if (!prop.CanRead)
+            {
+                continue;
+            }
+
+            try
+            {
+                object value = prop.GetValue(obj, null);
+                
+                if (IsSimpleType(propType))
+                {
+                    sb.AppendLine(indentStr + $"  {prop.Name} ({propType.Name}): {value}");
+                }
+                else
+                {
+                    sb.AppendLine(indentStr + $"  {prop.Name} ({propType.Name}):");
+                    PrintObjectDetail(sb, value, indent + 2, battleField, visitedObjects);
+                }
+            }
+            catch (Exception e)
+            {
+                sb.AppendLine(indentStr + $"  {prop.Name}: <瑙f瀽閿欒: {e.Message}>");
+            }
+        }
+    }
+
+    /// <summary>
+    /// 鍒ゆ柇鏄惁涓虹畝鍗曠被鍨嬶紙鐩存帴杈撳嚭鍊硷級
+    /// </summary>
+    private bool IsSimpleType(Type type)
+    {
+        return type.IsPrimitive || 
+               type == typeof(string) || 
+               type == typeof(decimal) || 
+               type == typeof(DateTime) ||
+               type.IsEnum;
+    }
+
+    /// <summary>
+    /// 鍒ゆ柇鏄惁搴旇璺宠繃璇ョ被鍨嬶紙Unity鍜孲ystem搴撶殑澶嶆潅绫诲瀷锛�
+    /// </summary>
+    private bool ShouldSkipType(Type type)
+    {
+        if (type.IsPrimitive || type == typeof(string) || type == typeof(decimal) || type.IsEnum)
+        {
+            return false;
+        }
+
+        string typeNamespace = type.Namespace ?? "";
+        
+        // 璺宠繃Unity鐩稿叧绫诲瀷锛堥櫎浜嗗熀鏈被鍨嬶級
+        if (typeNamespace.StartsWith("UnityEngine") || 
+            typeNamespace.StartsWith("Unity.") ||
+            typeNamespace.StartsWith("System.") && !typeNamespace.StartsWith("System.Collections"))
+        {
+            return true;
+        }
+
+        return false;
+    }
+
+    /// <summary>
+    /// 鑾峰彇缂╄繘瀛楃涓�
+    /// </summary>
+    private string GetIndent(int indent)
+    {
+        return new string(' ', indent * 2);
+    }
+#endif
 }
diff --git a/Main/System/Battle/BattleField/BattleField.cs b/Main/System/Battle/BattleField/BattleField.cs
index 00bb580..760a665 100644
--- a/Main/System/Battle/BattleField/BattleField.cs
+++ b/Main/System/Battle/BattleField/BattleField.cs
@@ -510,7 +510,7 @@
         }
     }
 
-    public virtual void OnObjsDead(List<BattleDeadPack> deadPackList)
+    public virtual void OnObjsDead(List<BattleDeadPack> deadPackList, RecordAction causingRecordAction = null)
     {
         if (deadPackList.Count > 0)
         {
@@ -545,7 +545,15 @@
             if (validDeadList.Count > 0)
             {
                 DeathRecordAction recordAction = new DeathRecordAction(this, validDeadList);
-                recordPlayer.ImmediatelyPlay(recordAction);
+                //  濡傛灉鏈夊鑷存浜$殑鎶�鑳斤紝灏咲eathRecordAction浣滀负鍏跺瓙鑺傜偣锛屽苟璁剧疆涓篧aitingPlay
+                if (causingRecordAction != null)
+                {
+                    recordPlayer.ImmediatelyPlay(recordAction, causingRecordAction, true);
+                }
+                else
+                {
+                    recordPlayer.ImmediatelyPlay(recordAction);
+                }
             }
         }
     }
diff --git a/Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs b/Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs
index 1f0c5bc..5a46323 100644
--- a/Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs
@@ -22,6 +22,7 @@
     {
         base.Run();
 
+        isActionCompleted = true;
         isFinish = true;
         onComplete?.Invoke();
     }
@@ -34,6 +35,11 @@
         onComplete?.Invoke();
     }
 
+    public override bool IsActionCompleted()
+    {
+        return isActionCompleted || isFinish;
+    }
+
     public override bool IsFinished()
     {
         return isFinish;
diff --git a/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs b/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs
index 6321135..e01ae0b 100644
--- a/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs
@@ -16,6 +16,11 @@
 		return isFinish;
 	}
 
+	public override bool IsActionCompleted()
+	{
+		return isActionCompleted || isFinish;
+	}
+
 
 	public override void Run()
 	{
@@ -55,6 +60,7 @@
 
 	private void StartBattleCallback()
 	{
+		isActionCompleted = true;
 		isFinish = true;
 		EventBroadcast.Instance.Broadcast(EventName.DISPLAY_BATTLE_UI, battleField.guid, true);
 		battleField.DistributeNextPackage();
diff --git a/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
index bcd04bd..c46e151 100644
--- a/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
@@ -15,10 +15,28 @@
 
     protected Dictionary<int, bool> dropStateDict = new Dictionary<int, bool>();
 
-    public DeathRecordAction(BattleField _battleField, List<BattleDeadPack> _deadPackList)
+    protected RecordAction causingRecordAction = null;
+
+    protected bool hasDeathTriggerSkill = false;
+
+    public DeathRecordAction(BattleField _battleField, List<BattleDeadPack> _deadPackList, RecordAction _causingRecordAction = null)
         : base(RecordActionType.Death, _battleField, null)
     {
         deadPackList = _deadPackList;
+        causingRecordAction = _causingRecordAction;
+        CheckHasDeathTriggerSkill();
+    }
+
+    protected void CheckHasDeathTriggerSkill()
+    {
+        foreach (var battleDeadPack in deadPackList)
+        {
+            if (battleDeadPack.deadTriggerSkill != null)
+            {
+                hasDeathTriggerSkill = true;
+                break;
+            }
+        }
     }
 
 
@@ -42,6 +60,10 @@
                     if (null != skillAction)
                     {
                         deathActionDict.Add(battleDeadPack, skillAction);
+                        //  姝讳骸瑙﹀彂鎶�鑳介兘璁剧疆WaitingPlay=true锛岀瓑寰呯埗鑺傜偣鍔ㄤ綔瀹屾垚
+                        //  濡傛灉DeathRecordAction鏈夌埗鑺傜偣锛堝鑷存浜$殑鎶�鑳斤級锛屽垯绛夊緟閭d釜鐖惰妭鐐�
+                        //  鍚﹀垯绛夊緟DeathRecordAction鏈韩
+                        battleField.recordPlayer.ImmediatelyPlay(skillAction, causingRecordAction == null ? this : causingRecordAction, true);
                     }
                 }
                 else
@@ -78,6 +100,11 @@
                 deathActionDict.Remove(key);
             }
 
+            if (0 == deathActionDict.Count)
+            {
+                hasDeathTriggerSkill = false;
+            }
+
             int completeNum = 0;
 
             foreach (var kv in deadActionStatesDict)
@@ -90,9 +117,18 @@
 
             if (completeNum == deadPackList.Count)
             {
+                isActionCompleted = true;
                 isFinish = true;
             }
         }
+    }
+
+
+
+    //  閲嶅啓IsActionCompleted锛屾浜″姩浣滄槸鍚﹀畬鎴�
+    public override bool IsActionCompleted()
+    {
+        return isActionCompleted || isFinish;
     }
 
     private Func<bool> CreateDeadActionState(BattleDeadPack deadPack, bool withoutAnime = false)
@@ -166,4 +202,39 @@
             deadObj.PerformDrop();
         }
     }
+
+    protected bool HasDeathTriggerSkill()
+    {
+        return hasDeathTriggerSkill;
+    }
+
+    public override bool CanStartExecution()
+    {
+        //  濡傛灉涓嶆槸WaitingPlay妯″紡锛岀洿鎺ュ彲浠ユ墽琛�
+        if (!isWaitingPlay)
+        {
+            return true;
+        }
+        
+        //  濡傛灉娌℃湁鐖惰妭鐐癸紝涔熷彲浠ユ墽琛�
+        if (parentAction == null)
+        {
+            return true;
+        }
+
+        //  鍙互鍏堟墽琛屾病鏈夋浜¤Е鍙戞妧鑳界殑姝讳骸鍔ㄤ綔
+        if (!HasDeathTriggerSkill())
+        {
+            return true;
+        }
+        
+        //  WaitingPlay妯″紡涓嬶紝闇�瑕佺瓑寰呯洿鎺ョ埗鑺傜偣鐨勫姩浣滃畬鎴愶紙涓嶇鐖惰妭鐐规槸鍚aitingPlay锛�
+        if (!parentAction.IsActionCompleted())
+        {
+            BattleDebug.LogError($"RecordAction.CanStartExecution: {this.GetType().Name} 绛夊緟鐖惰妭鐐� {parentAction.GetType().Name} 鍔ㄤ綔瀹屾垚");
+            return false;
+        }
+        
+        return true;
+    }
 }
\ No newline at end of file
diff --git a/Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs
index 109c976..b0eb08f 100644
--- a/Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs
@@ -36,6 +36,12 @@
         }
     }
 
+    //  閲嶅啓IsActionCompleted锛屽綋鍔ㄧ敾鎾斁缁撴潫鏃舵爣璁颁负瀹屾垚
+    public override bool IsActionCompleted()
+    {
+        return isActionCompleted || isFinish;
+    }
+
     //  鍋氫竴涓粠閫忔槑鍒版仮澶嶇殑娓愬彉鐨勫悓鏃� 鎾斁鐗规晥
     public void PlayRebornEffect()
     {
@@ -58,6 +64,7 @@
             battleObject?.AfterReborn();
             actionCallback?.Invoke();
             actionCallback = null;
+            isActionCompleted = true;  // 鏍囪鍔ㄤ綔瀹屾垚
             isFinish = true;
         }));
 
diff --git a/Main/System/Battle/BattleField/RecordActions/RoundChangeAction.cs b/Main/System/Battle/BattleField/RecordActions/RoundChangeAction.cs
index 9587aa2..968a75e 100644
--- a/Main/System/Battle/BattleField/RecordActions/RoundChangeAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/RoundChangeAction.cs
@@ -18,6 +18,7 @@
 			return;
 
 		roundChangeCallback?.Invoke();
+		isActionCompleted = true;
 		isFinish = true;
     }
 
@@ -27,6 +28,12 @@
 			return;
 		base.Run();
 		roundChangeCallback?.Invoke();
+		isActionCompleted = true;
 		isFinish = true;
 	}
+
+	public override bool IsActionCompleted()
+	{
+		return isActionCompleted || isFinish;
+	}
 }
\ No newline at end of file
diff --git a/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
index 8f13aa1..e6cb300 100644
--- a/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
@@ -5,6 +5,8 @@
 {
 	protected SkillBase skillBase;
 
+	public HB427_tagSCUseSkill hB427_TagSCUseSkill;
+
 	private bool isCast = false;
 
 	public SkillBase fromSkill = null;
@@ -15,12 +17,26 @@
 		// Debug.LogError("_caster == null : " + (_caster == null));
 
 		skillBase = SkillFactory.CreateSkill(_caster, vNetData, packList, _battleField);
-
+		hB427_TagSCUseSkill = vNetData;
 		if (null == skillBase)
 		{
 			BattleUtility.ForceFinishBattlePackList(battleField, packList);
 		}
+		else
+		{
+			//  璁㏒killBase鐭ラ亾鑷繁鐨凴ecordAction
+			skillBase.SetParentRecordAction(this);
+		}
 	}
+    public override bool IsNeedWaiting()
+    {
+		if (skillBase == null)
+		{
+			return false;
+		}
+        return !string.IsNullOrEmpty(skillBase.skillConfig.SkillMotionName);
+    }
+
 
 	public override bool IsFinished()
 	{
@@ -29,6 +45,16 @@
 			return true;
 		}
 		return skillBase.IsFinished();
+	}
+
+	//  妫�鏌ヨ嚜韬姩浣滄槸鍚﹀畬鎴愶紙涓嶅寘鎷瓙鑺傜偣锛�
+	public override bool IsActionCompleted()
+	{
+		if (null == skillBase)
+		{
+			return true;
+		}
+		return skillBase.IsFinishedForJudge();
 	}
 
 	public bool IsFinishedForJudge()
@@ -49,6 +75,23 @@
 		}
         base.ForceFinish();
     }
+	
+	public override bool CanStartExecution()
+	{
+		if (null == skillBase)
+		{
+			return false;
+		}
+
+		if (!skillBase.CanStartExecution())
+		{
+			return false;
+		}
+
+
+		return base.CanStartExecution();
+	}
+
 
 	public override void Run()
 	{
@@ -67,6 +110,8 @@
 		if (isCast)
 			return;
 
+		Played();
+
 		if (fromSkill != null)
 		{
 			BattleDebug.LogError("cast skill from skill : " + fromSkill.skillConfig.SkillID);
diff --git a/Main/System/Battle/BattleObject/BattleObject.cs b/Main/System/Battle/BattleObject/BattleObject.cs
index 71a9942..cba9472 100644
--- a/Main/System/Battle/BattleObject/BattleObject.cs
+++ b/Main/System/Battle/BattleObject/BattleObject.cs
@@ -315,7 +315,7 @@
         return true;
     }
 
-    public virtual void Hurt(BattleHurtParam battleHurtParam)
+    public virtual void Hurt(BattleHurtParam battleHurtParam, RecordAction causingRecordAction = null)
     {
         bool isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillConfig.DamageDivide.Length - 1;
         bool firstHit = battleHurtParam.hitIndex == 0;
@@ -352,7 +352,7 @@
             {
                 PushDropItems(battleHurtParam.battleDrops);
             }
-            battleField.OnObjsDead(new List<BattleDeadPack>() { battleHurtParam.deadPack });
+            battleField.OnObjsDead(new List<BattleDeadPack>() { battleHurtParam.deadPack }, causingRecordAction);
 
         }
         else
diff --git a/Main/System/Battle/Motion/MotionBase.cs b/Main/System/Battle/Motion/MotionBase.cs
index 673ddbd..87bddfe 100644
--- a/Main/System/Battle/Motion/MotionBase.cs
+++ b/Main/System/Battle/Motion/MotionBase.cs
@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using UnityEngine;
 using Spine.Unity;
+using Cysharp.Threading.Tasks;
 
 public class MotionBase
 {
@@ -64,6 +65,7 @@
 
         PlayAnimation(MotionName.idle, true);
         SetupAnimationHandlers();
+        skillTrack = null;
         
         if (skelAnim.gameObject != null)
             illusionShadow = skelAnim.gameObject.AddMissingComponent<SkeletonIllusionShadow>();
@@ -173,6 +175,9 @@
         return ExecuteSkillAnim(skillConfig, skillBase, onComplete, targetAnim, true, isSubSkill);
     }
 
+    private Spine.TrackEntry skillTrack = null;
+
+
     private Spine.TrackEntry ExecuteSkillAnim(SkillConfig skillConfig, SkillBase skillBase, Action onComplete,
         Spine.Animation targetAnim, bool hasAnim, bool isSubSkill)
     {
@@ -215,10 +220,22 @@
             }
         }
         
-        Spine.TrackEntry skillTrack = null;
         
         if (hasAnim)
         {
+            if (null != skillTrack)
+            {
+                //绛夊緟涓婁竴鎶�鑳藉姩鐢荤粨鏉� 鏆傛椂澶勭悊鍔炴硶
+                UniTaskExtension.DelayFrames((GameObject)null, 1, () =>
+                {
+                    if (skillBase != null && !skillBase.IsFinished())
+                    {
+                        PlaySkillAnimation(skillConfig, skillBase, isSubSkill, onComplete);
+                    }
+                });
+                return null;
+            }
+
             skillTrack = animState.SetAnimation(trackIndex, targetAnim, false);
             if (null == skillTrack)
             {
@@ -441,6 +458,7 @@
                     RemoveAction(frameHandler);
                     onComplete?.Invoke();
                     skillBase.OnFinalFrameEnd();
+                    skillTrack = null;
                 }
             }
         };
@@ -599,6 +617,8 @@
             availableSubTracks.Enqueue(i);
 
         currentTrack = null;
+
+        skillTrack = null;
         
         playingSkillAnim = false;
         PlayAnimation(MotionName.idle, true);
@@ -657,7 +677,7 @@
             skeleton.SetToSetupPose();
             // skeleton.UpdateWorldTransform();
         }
-        
+        skillTrack = null;
         // 10. 鎾斁寰呮満鍔ㄧ敾
         PlayAnimation(MotionName.idle, true);
         skeletonAnim.LateUpdate();
@@ -678,4 +698,9 @@
         }
     }
 
+    public bool CanCastSkill()
+    {
+        //  涓婃閲婃斁鐨勬妧鑳� 閲婃斁缁撴潫浜嗘病鏈�
+        return !playingSkillAnim;
+    }
 }
\ No newline at end of file
diff --git a/Main/System/Battle/RecordPlayer/RecordAction.cs b/Main/System/Battle/RecordPlayer/RecordAction.cs
index bc5ee39..76bdc10 100644
--- a/Main/System/Battle/RecordPlayer/RecordAction.cs
+++ b/Main/System/Battle/RecordPlayer/RecordAction.cs
@@ -14,6 +14,19 @@
 
     protected bool isRunOnce = false;
 
+    //  ===== 鐖跺瓙鍏崇郴鍜岀瓑寰呮満鍒� =====
+    //  鐖禦ecordAction寮曠敤锛堝鏋滄槸閫氳繃鍏朵粬RecordAction鍐呴儴瑙﹀彂鐨勶級
+    public RecordAction parentAction;
+    
+    //  瀛怰ecordAction鍒楄〃锛堟RecordAction鍐呴儴瑙﹀彂鐨勫叾浠朢ecordAction锛�
+    protected List<RecordAction> childActionList = new List<RecordAction>();
+    
+    //  鏄惁鏄疻aitingPlay妯″紡锛堥渶瑕佺瓑寰呯埗鑺傜偣鍔ㄤ綔瀹屾垚锛�
+    public bool isWaitingPlay = false;
+    
+    //  鑷韩鍔ㄤ綔鏄惁瀹屾垚锛堜笉鍖呮嫭瀛愯妭鐐圭殑瀹屾垚鐘舵�侊級
+    protected bool isActionCompleted = false;
+
     public RecordAction(RecordActionType _actionType, BattleField _battleField, BattleObject _battleObj)
     {
         actionType = _actionType;
@@ -21,11 +34,105 @@
         battleObject = _battleObj;
     }
 
+    public virtual void Played()
+    {
+
+    }
+
     public RecordActionType actionType;
 
+    //  娣诲姞瀛怰ecordAction
+    public virtual void AddChildAction(RecordAction child)
+    {
+        if (child == null) return;
+        
+        //  闃叉閲嶅娣诲姞
+        if (childActionList.Contains(child)) return;
+        
+        //  闃叉寰幆渚濊禆
+        if (child == this)
+        {
+            BattleDebug.LogError("RecordAction.AddChildAction: 涓嶈兘灏嗚嚜宸辨坊鍔犱负瀛愯妭鐐�");
+            return;
+        }
+        
+        childActionList.Add(child);
+        BattleDebug.LogError($"RecordAction.AddChildAction: {this.GetType().Name} 娣诲姞瀛愯妭鐐� {child.GetType().Name}");
+    }
+
+    //  璁剧疆鐖禦ecordAction
+    public virtual void SetParentAction(RecordAction parent)
+    {
+        parentAction = parent;
+        if (parent != null)
+        {
+            BattleDebug.LogError($"RecordAction.SetParentAction: {this.GetType().Name} 鐨勭埗鑺傜偣璁剧疆涓� {parent.GetType().Name}");
+        }
+    }
+
+    //  璁剧疆WaitingPlay鏍囪
+    public virtual void SetWaitingPlay(bool waiting)
+    {
+        isWaitingPlay = waiting;
+        BattleDebug.LogError($"RecordAction.SetWaitingPlay: {this.GetType().Name} WaitingPlay={waiting}");
+    }
+
+    //  妫�鏌ヨ嚜韬姩浣滄槸鍚﹀畬鎴愶紙涓嶅寘鎷瓙鑺傜偣锛�
+    //  瀛愮被搴旇閲嶅啓姝ゆ柟娉曟潵瀹炵幇鑷繁鐨勫姩浣滃畬鎴愬垽鏂�
+    public virtual bool IsActionCompleted()
+    {
+        return isActionCompleted;
+    }
+
+    //  妫�鏌ユ槸鍚﹀彲浠ュ紑濮嬫墽琛岋紙WaitingPlay鏉′欢妫�鏌ワ級
+    public virtual bool CanStartExecution()
+    {
+        //  濡傛灉涓嶆槸WaitingPlay妯″紡锛岀洿鎺ュ彲浠ユ墽琛�
+        if (!isWaitingPlay)
+        {
+            return true;
+        }
+        
+        //  濡傛灉娌℃湁鐖惰妭鐐癸紝涔熷彲浠ユ墽琛�
+        if (parentAction == null)
+        {
+            return true;
+        }
+        
+        //  WaitingPlay妯″紡涓嬶紝闇�瑕佺瓑寰呯洿鎺ョ埗鑺傜偣鐨勫姩浣滃畬鎴愶紙涓嶇鐖惰妭鐐规槸鍚aitingPlay锛�
+        if (!parentAction.IsActionCompleted())
+        {
+            BattleDebug.LogError($"RecordAction.CanStartExecution: {this.GetType().Name} 绛夊緟鐖惰妭鐐� {parentAction.GetType().Name} 鍔ㄤ綔瀹屾垚");
+            return false;
+        }
+        
+        return true;
+    }
+
+    public virtual bool IsNeedWaiting()
+    {
+        return false;
+    }
+
+    //  妫�鏌ユ槸鍚﹀畬鍏ㄥ畬鎴愶紙鍖呮嫭鎵�鏈夊瓙鑺傜偣锛�
     public virtual bool IsFinished()
     {
-        return isFinish;
+        //  棣栧厛鑷韩鍔ㄤ綔蹇呴』瀹屾垚
+        if (!isActionCompleted && !isFinish)
+        {
+            return false;
+        }
+        
+        //  妫�鏌ユ墍鏈夊瓙鑺傜偣鏄惁瀹屾垚
+        foreach (var child in childActionList)
+        {
+            if (!child.IsFinished())
+            {
+                return false;
+            }
+        }
+        
+        return true;
     }
 
     public virtual void Run()
@@ -36,6 +143,18 @@
     public virtual void ForceFinish()
     {
         isFinish = true;
+        isActionCompleted = true;
+        
+        //  寮哄埗缁撴潫鎵�鏈夊瓙鑺傜偣
+        for (int i = childActionList.Count - 1; i >= 0; i--)
+        {
+            var child = childActionList[i];
+            child?.ForceFinish();
+        }
+        
+        //  娓呯悊鐖跺瓙寮曠敤锛岄槻姝㈠唴瀛樻硠婕�
+        childActionList.Clear();
+        parentAction = null;
     }
 
     public virtual string GetBattleFieldGuid()
diff --git a/Main/System/Battle/RecordPlayer/RecordPlayer.cs b/Main/System/Battle/RecordPlayer/RecordPlayer.cs
index 2994bea..f73d78d 100644
--- a/Main/System/Battle/RecordPlayer/RecordPlayer.cs
+++ b/Main/System/Battle/RecordPlayer/RecordPlayer.cs
@@ -43,7 +43,7 @@
     public void PlayRecord(RecordAction recordAction)
     {
         if (recordAction == null) return;
-        BattleDebug.LogError("Enqueue record action " + recordAction.GetType());
+        // Debug.LogError("Enqueue record action " + recordAction.GetType() + " to queue");
         if (isForceFinish || stepForcefinish)
         {
             recordAction.ForceFinish();
@@ -69,7 +69,7 @@
             return;
         }
 
-        BattleDebug.LogError("Insert record action " + recordAction.GetType());
+        // Debug.LogError("Insert record action " + recordAction.GetType() + " at front of queue");
         if (currentRecordAction != null)
         {
             Queue<RecordAction> tempQueue = new Queue<RecordAction>();
@@ -97,13 +97,39 @@
         immediatelyActionList.Add(recordAction);
     }
 
+    //  澧炲己鐗堟湰锛氭敮鎸佺埗瀛愬叧绯诲拰WaitingPlay鏍囪
+    public void ImmediatelyPlay(RecordAction recordAction, RecordAction parentAction, bool isWaitingPlay)
+    {
+        if (recordAction == null) return;
+        if (isForceFinish || stepForcefinish)
+        {
+            recordAction.ForceFinish();
+            return;
+        }
+
+        // Debug.LogError("insert recordAction ImmediatelyPlay: " + recordAction.GetType().Name + " parentAction: " + (parentAction != null ? parentAction.GetType().Name : "null") + " isWaitingPlay: " + isWaitingPlay);
+        
+        //  璁剧疆鐖跺瓙鍏崇郴
+        if (parentAction != null)
+        {
+            recordAction.SetParentAction(parentAction);
+            parentAction.AddChildAction(recordAction);
+        }
+        
+        //  璁剧疆WaitingPlay鏍囪
+        recordAction.SetWaitingPlay(isWaitingPlay);
+        
+        immediatelyActionList.Add(recordAction);
+    }
+
     protected void ImmediatelyPlayRun()
     {
         if (immediatelyActionList.Count > 0)
         {
             List<int> removeIndexList = new List<int>();
 
-            for (int i = immediatelyActionList.Count - 1; i >= 0; i--)
+            //  鍏抽敭淇锛氫粠鍓嶅線鍚庨亶鍘嗭紝纭繚鎸夊姞鍏ラ『搴忔墽琛�
+            for (int i = 0; i < immediatelyActionList.Count; i++)
             {
                 var action = immediatelyActionList[i];
                 if (action == null)
@@ -111,6 +137,38 @@
                     removeIndexList.Add(i);
                     continue;
                 }
+                
+                //  妫�鏌ユ槸鍚﹀彲浠ュ紑濮嬫墽琛岋紙WaitingPlay鏉′欢妫�鏌ワ級
+                if (!action.CanStartExecution())
+                {
+                    continue;
+                }
+                
+                //  妫�鏌ュ悓绾х殑鍓嶇疆鍏勫紵鑺傜偣锛氬鏋滄湁鐩稿悓鐖惰妭鐐逛笖绱㈠紩鏇村皬鐨勮妭鐐硅繕鍦ㄦ墽琛岋紝鍒欑瓑寰�
+                bool shouldWaitForSibling = false;
+                if (action.isWaitingPlay && action.parentAction != null)
+                {
+                    for (int j = 0; j < i; j++)
+                    {
+                        var prevAction = immediatelyActionList[j];
+                        if (prevAction != null && prevAction.parentAction == action.parentAction)
+                        {
+                            //  鎵惧埌鍚岀骇鍓嶇疆鑺傜偣锛屽鏋滃畠杩樺湪鎵ц涓紝鍒欏綋鍓嶈妭鐐归渶瑕佺瓑寰�
+                            if (!prevAction.IsFinished())
+                            {
+                                shouldWaitForSibling = true;
+                                // BattleDebug.LogError($"RecordPlayer: {action.GetType().Name} 绛夊緟鍚岀骇鍓嶇疆鑺傜偣 {prevAction.GetType().Name} 瀹屾垚");
+                                break;
+                            }
+                        }
+                    }
+                }
+                
+                if (shouldWaitForSibling)
+                {
+                    continue;
+                }
+                
                 if (!action.IsFinished())
                 {
                     action.Run();
@@ -120,6 +178,7 @@
                 removeIndexList.Add(i);
             }
 
+            //  浠庡悗寰�鍓嶅垹闄わ紝纭繚绱㈠紩涓嶄細鍥犱负鍒犻櫎鑰岄敊浣�
             for (int i = removeIndexList.Count - 1; i >= 0; i--)
             {
                 int index = removeIndexList[i];
@@ -166,7 +225,7 @@
         if (currentRecordAction != null && currentRecordAction.IsFinished())
         {
             var guid = currentRecordAction.GetBattleFieldGuid();
-            BattleDebug.LogError("record action " + currentRecordAction.GetType() + " play finished");
+            // BattleDebug.LogError("record action " + currentRecordAction.GetType() + " play finished");
             currentRecordAction = null;
             isWaitingNextAction = true;
             waitTimer = 0f;
@@ -179,7 +238,7 @@
             if (recordActionQueue.Count > 0)
             {
                 currentRecordAction = recordActionQueue.Dequeue();
-                BattleDebug.LogError("play record action " + currentRecordAction.GetType());
+                // BattleDebug.LogError("play record action " + currentRecordAction.GetType());
             }
         }
     }
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 056b849..da38c42 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -28,11 +28,18 @@
     protected List<H0704_tagRolePackRefresh> dropPackList = new List<H0704_tagRolePackRefresh>();
     protected List<HB405_tagMCAddExp> expPackList = new List<HB405_tagMCAddExp>();
 
-    protected List<BattleDeadPack> endDeadPackList = new List<BattleDeadPack>();
+    protected List<SkillRecordAction> waitingCastSkillRecordAction = new List<SkillRecordAction>();
+
 
     protected bool moveFinished = false;
     public SkillBase fromSkill;
     public bool isPlay = false;
+
+    //  鐖禦ecordAction锛圫killRecordAction锛夛紝鐢ㄤ簬瀛愭妧鑳藉缓绔嬬埗瀛愬叧绯�
+    protected RecordAction parentRecordAction;
+    
+    //  鎶�鑳藉姩鐢绘槸鍚︽挱鏀惧畬鎴愶紙閽堝鏈夊姩鐢荤殑鎶�鑳斤級
+    protected bool isMotionCompleted = false;
 
     private float MoveSpeed = 750f;
 
@@ -59,12 +66,12 @@
         }
 
         SafetyCheck();
-#if UNITY_EDITOR
-        if (Launch.Instance.isOpenSkillLogFile)
-        {
-            PinrtHB427Hp();
-        }
-#endif
+    }
+
+    //  璁剧疆鐖禦ecordAction
+    public void SetParentRecordAction(RecordAction recordAction)
+    {
+        parentRecordAction = recordAction;
     }
 
 #if UNITY_EDITOR
@@ -144,6 +151,13 @@
 
     private void SafetyCheck()
     {
+#if UNITY_EDITOR
+        if (Launch.Instance.isOpenSkillLogFile)
+        {
+            PinrtHB427Hp();
+        }
+#endif
+
         bool safety = caster != null 
                         && skillConfig != null 
                         && tagUseSkillAttack != null 
@@ -485,24 +499,60 @@
 
         skillEffect = SkillEffectFactory.CreateSkillEffect(this, caster, skillConfig, tagUseSkillAttack);
         skillEffect.Play(OnHitTargets);
+        ProcessSubSkill();
+        HandleWaitingCastSkill();
+
+        isPlay = true;
+    }
+
+    protected void ProcessSubSkill()
+    {
         foreach (var subSkillPack in tagUseSkillAttack.subSkillList)
         {
             SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, new List<GameNetPackBasic>() { subSkillPack });
             recordAction.fromSkill = this;
-            otherSkillActionList.Add(recordAction);
-            battleField.recordPlayer.ImmediatelyPlay(recordAction);
+            //  瀛愭妧鑳借缃甒aitingPlay=true锛岀瓑寰呯埗鎶�鑳藉姩浣滃畬鎴�
+            waitingCastSkillRecordAction.Add(recordAction);
+            battleField.recordPlayer.ImmediatelyPlay(recordAction, parentRecordAction, true);
         }
         tagUseSkillAttack.subSkillList.Clear();
         foreach (var subCombinePack in tagUseSkillAttack.subSkillCombinePackList)
         {
             SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, subCombinePack.packList);
             recordAction.fromSkill = this;
-            otherSkillActionList.Add(recordAction);
-            battleField.recordPlayer.ImmediatelyPlay(recordAction);
+            //  瀛愭妧鑳借缃甒aitingPlay=true锛岀瓑寰呯埗鎶�鑳藉姩浣滃畬鎴�
+            waitingCastSkillRecordAction.Add(recordAction);
         }
         tagUseSkillAttack.subSkillCombinePackList.Clear();
 
-        isPlay = true;
+        waitingCastSkillRecordAction.OrderBy(recordAction => recordAction.hB427_TagSCUseSkill.packUID);
+
+        
+    }
+
+    protected void HandleWaitingCastSkill()
+    {
+        RecordAction waitingRecordAction = null;
+
+        for (int i = 0; i < waitingCastSkillRecordAction.Count; i++)
+        {
+            var recordAction = waitingCastSkillRecordAction[i];
+
+            if (waitingRecordAction != null)
+            {
+                //  姣忎釜閮藉簲璇ョ瓑鍓嶄竴涓粨鏉熷悗
+                battleField.recordPlayer.ImmediatelyPlay(recordAction, waitingRecordAction, true);
+            }
+            else
+            {
+                battleField.recordPlayer.ImmediatelyPlay(recordAction, parentRecordAction, true);
+            }
+
+            if (recordAction.IsNeedWaiting())
+            {
+                waitingRecordAction = recordAction;
+            }
+        }
     }
 
     // 鎶�鑳藉墠鎽囩粨鏉熷洖璋�
@@ -529,6 +579,9 @@
     // 鎶�鑳藉悗鎽囩粨鏉熷洖璋冿細閫氱煡鎶�鑳芥晥鏋滃鐞嗗悗鎽囩粨鏉�
     public virtual void OnFinalFrameEnd()
     {
+        //  鏍囪鍔ㄧ敾鎾斁瀹屾垚
+        isMotionCompleted = true;
+        BattleDebug.LogError($"SkillBase.OnFinalFrameEnd: 鎶�鑳� {skillConfig?.SkillID} 鍔ㄧ敾鎾斁瀹屾垚");
         
         skillEffect?.OnFinalFrameEnd(); // 淇锛氭坊鍔犵┖鍊兼鏌�
     }
@@ -728,7 +781,7 @@
 #endif
 
         // 鍏堣皟鐢ㄧ洰鏍囧彈浼�
-        target.Hurt(hurtParam);
+        target.Hurt(hurtParam, parentRecordAction);
         
         // 鍐嶈皟鐢ㄦ柦娉曡�呭惛琛�/鍙嶄激
         caster.OnHurtTarget(hurtParam);
@@ -1008,6 +1061,16 @@
                 return false;
             }
 
+            //  濡傛灉鎶�鑳芥湁鍔ㄧ敾锛圫killMotionName涓嶄负绌猴級锛岄渶瑕佺瓑寰呭姩鐢绘挱鏀惧畬鎴�
+            if (skillConfig != null && !string.IsNullOrEmpty(skillConfig.SkillMotionName))
+            {
+                if (!isMotionCompleted)
+                {
+                    BattleDebug.LogError($"SkillBase.IsFinishedForJudge: 鎶�鑳� {skillConfig.SkillID} 绛夊緟鍔ㄧ敾鎾斁瀹屾垚");
+                    return false;
+                }
+            }
+
             return true;
         }
 
@@ -1067,6 +1130,7 @@
             {
                 battleField.RemoveCastingSkill(caster.ObjID, this);
                 
+                //  浼犻�抪arentRecordAction锛岃姝讳骸鎶�鑳界瓑寰呭綋鍓嶆妧鑳藉畬鎴�
                 battleField.OnObjsDead(new List<BattleDeadPack>(tempDeadPackList.Values));
             }
 
@@ -1089,7 +1153,8 @@
             battleField.RemoveCastingSkill(caster.ObjID, this);
         }
 
-        battleField.OnObjsDead(new List<BattleDeadPack>(tempDeadPackList.Values));
+        //  浼犻�抪arentRecordAction锛岃姝讳骸鎶�鑳界瓑寰呭綋鍓嶆妧鑳藉畬鎴�
+        battleField.OnObjsDead(new List<BattleDeadPack>(tempDeadPackList.Values), parentRecordAction);
 
         // 1. 寮哄埗缁撴潫鎶�鑳芥晥鏋�
         skillEffect?.ForceFinished();
@@ -1100,7 +1165,8 @@
             SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, new List<GameNetPackBasic>() { subSkillPack });
             recordAction.fromSkill = this;
             otherSkillActionList.Add(recordAction);
-            battleField.recordPlayer.ImmediatelyPlay(recordAction);
+            //  瀛愭妧鑳借缃甒aitingPlay=true锛岀瓑寰呯埗鎶�鑳藉姩浣滃畬鎴�
+            battleField.recordPlayer.ImmediatelyPlay(recordAction, parentRecordAction, true);
         }
         tagUseSkillAttack.subSkillList.Clear();
         foreach (var subCombinePack in tagUseSkillAttack.subSkillCombinePackList)
@@ -1108,7 +1174,8 @@
             SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, subCombinePack.packList);
             recordAction.fromSkill = this;
             otherSkillActionList.Add(recordAction);
-            battleField.recordPlayer.ImmediatelyPlay(recordAction);
+            //  瀛愭妧鑳借缃甒aitingPlay=true锛岀瓑寰呯埗鎶�鑳藉姩浣滃畬鎴�
+            battleField.recordPlayer.ImmediatelyPlay(recordAction, parentRecordAction, true);
         }
         tagUseSkillAttack.subSkillCombinePackList.Clear();
         
@@ -1173,6 +1240,9 @@
         isFinished = true;
         moveFinished = true;
         isPlay = true;
+        
+        //  寮哄埗缁撴潫鏃讹紝鏃犺鏄惁鏈夊姩鐢伙紝閮芥爣璁板姩鐢诲畬鎴�
+        isMotionCompleted = true;
 
         // 6. 澶勭悊鎵�鏈夊墿浣欏寘锛堝寘鎷� buff 鍖咃級
         // 鍏堝鐞� buffPackCollections
@@ -1377,6 +1447,26 @@
         }
     }
 
+    public virtual bool CanStartExecution()
+    {
+        if (null == caster)
+        {
+            return false;
+        }
+
+        if (null == skillConfig)
+        {
+            return false;
+        }
+
+        if (string.IsNullOrEmpty(skillConfig.SkillMotionName))
+        {
+            return true;
+        }
+
+        return !battleField.IsCastingSkill(caster.ObjID);
+    }
+
     #endregion
 
 }
\ No newline at end of file

--
Gitblit v1.8.0