yyl
2026-01-21 f59b136d28cbfc0b9de9bced637845ce35345d95
125 战斗 处理卡死问题
1个文件已修改
34 ■■■■■ 已修改文件
Main/System/Battle/Motion/MotionBase.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Motion/MotionBase.cs
@@ -15,6 +15,8 @@
    };
    private Dictionary<Spine.TrackEntry, Action> trackEntryCallbacks = new Dictionary<Spine.TrackEntry, Action>();
    private Dictionary<int, SkillBase> skillTrackDict = new Dictionary<int, SkillBase>();
    public Action OnAttackAnimationComplete;
    public Action OnHitAnimationComplete;
    private List<Action> runningActions = new List<Action>();
@@ -89,6 +91,7 @@
        currentTrack = null;
        playingSkill = false;
        playingSkillWithAnim = false;
        skillTrackDict.Clear();
    }
    public virtual Spine.TrackEntry PlayAnimation(MotionName motionName, bool loop, Action onComplete = null)
@@ -181,7 +184,6 @@
    private Spine.TrackEntry ExecuteSkillAnim(SkillConfig skillConfig, SkillBase skillBase, Action onComplete,
        Spine.Animation targetAnim, bool hasAnim, bool isSubSkill)
    {
        bool isPangdeSkill = 1003020 == skillConfig.SkillID;
        int loopCount = skillConfig.LoopCount;
        //  前摇
@@ -224,7 +226,8 @@
        
        if (hasAnim)
        {
            if (null != skillTrack)
            // 检查轨道是否已被占用(修复:原来检查 null != skillTrack 永远为 false)
            if (activeSkillTracks.ContainsKey(trackIndex) || skillTrackDict.ContainsKey(trackIndex))
            {
                //等待上一技能动画结束 暂时处理办法
                UniTaskExtension.DelayFrames((GameObject)null, 1, () =>
@@ -250,6 +253,14 @@
                }
                return null;
            }
            if (skillTrackDict.ContainsKey(trackIndex))
            {
                skillBase.ForceFinished();
                skillTrackDict.Remove(trackIndex);
            }
            skillTrackDict[trackIndex] = skillBase;
            
            // 只有主技能才更新 currentTrack
            if (!isSubSkill)
@@ -279,6 +290,7 @@
        {
            if (skillBase.IsFinished())
            {
                skillTrackDict.Remove(trackIndex);
                // 清理并退出(保证状态一致)
                if (skillTrack != null && activeSkillTracks.ContainsKey(trackIndex))
                {
@@ -332,6 +344,8 @@
                // 检查当前轨道是否被新技能覆盖
                if (!activeSkillTracks.ContainsKey(trackIndex) || activeSkillTracks[trackIndex] != skillTrack)
                {
                    skillTrackDict[trackIndex].ForceFinished();
                    skillTrackDict.Remove(trackIndex);
                    Debug.LogError("技能动画被打断,强制结束 " + skillConfig.SkillID);
                    skillBase.ForceFinished();
@@ -471,6 +485,8 @@
                    {
                        playingSkill = false;
                    }
                    skillTrackDict.Remove(trackIndex);
                    RemoveAction(frameHandler);
                    onComplete?.Invoke();
@@ -627,6 +643,13 @@
        runningActions.Clear();
        activeSkillTracks.Clear();
        
        // 强制结束所有正在执行的技能
        foreach (var kv in skillTrackDict)
        {
            kv.Value?.ForceFinished();
        }
        skillTrackDict.Clear();
        // 重置子技能轨道池
        if (availableSubTracks == null)
            availableSubTracks = new Queue<int>();
@@ -659,6 +682,13 @@
        
        activeSkillTracks.Clear();
        
        // 强制结束所有正在执行的技能(复活时需要清理所有技能状态)
        foreach (var kv in skillTrackDict)
        {
            kv.Value?.ForceFinished();
        }
        skillTrackDict.Clear();
        // 3. 重置子技能轨道池
        if (availableSubTracks == null)
            availableSubTracks = new Queue<int>();