yyl
2026-04-22 b8f554f03a6114db353736741eda63bdd6c63854
Main/System/Battle/BattleField/BattleField.cs
@@ -107,6 +107,21 @@
        if (castingSkillDict.TryGetValue(objID, out skillBases))
        {
#if UNITY_EDITOR
            //  诊断:同一个 caster 已经在 casting,说明前一个技能没正确 Remove。
            //  打印现存技能的 skillId / StateFlags,方便定位泄漏点。
            var sb = new System.Text.StringBuilder();
            sb.Append("BattleField.AddCastingSkill 发现同 caster 已有 ").Append(skillBases.Count).Append(" 个 casting 技能未清理:objID=").Append(objID);
            sb.Append("  新入=skillId=").Append(skill?.skillConfig?.SkillID ?? 0);
            for (int i = 0; i < skillBases.Count; i++)
            {
                var s = skillBases[i];
                sb.Append("\n    [").Append(i).Append("] skillId=")
                  .Append(s?.skillConfig?.SkillID ?? 0)
                  .Append(" StateFlags=").Append(s == null ? "null" : s.StateFlagsForDebug.ToString());
            }
            BattleDebug.LogError(sb.ToString());
#endif
            skillBases.Add(skill);
        }
        else
@@ -123,6 +138,13 @@
        if (castingSkillDict.TryGetValue(objID, out skillBases))
        {
#if UNITY_EDITOR
            bool existed = skillBases.Contains(skillBase);
            if (!existed)
            {
                BattleDebug.LogError($"BattleField.RemoveCastingSkill 目标不在 casting 列表:objID={objID} skillId={skillBase?.skillConfig?.SkillID ?? 0}");
            }
#endif
            skillBases.Remove(skillBase);
            if (skillBases.Count == 0)
@@ -130,6 +152,12 @@
                castingSkillDict.Remove(objID);
            }
        }
#if UNITY_EDITOR
        else
        {
            BattleDebug.LogError($"BattleField.RemoveCastingSkill objID 不在字典里:objID={objID} skillId={skillBase?.skillConfig?.SkillID ?? 0}");
        }
#endif
    }
    public bool IsCastingSkill(long objID)