125 战斗 死亡被错误计入activeSkillTracks 导致的技能播放状态未重置问题
1个文件已修改
32 ■■■■■ 已修改文件
Main/System/Battle/Motion/MotionBase.cs 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Motion/MotionBase.cs
@@ -28,6 +28,9 @@
    private Spine.TrackEntry currentTrack;
    private Dictionary<int, Spine.TrackEntry> activeSkillTracks = new Dictionary<int, Spine.TrackEntry>();
    
    // 死亡动画专用轨道索引
    private const int DeathTrackIndex = 9;
    // 子技能轨道池管理(在Init中初始化,不要在这里初始化)
    private Queue<int> availableSubTracks;
    private Dictionary<SkillBase, int> subSkillTrackMap = new Dictionary<SkillBase, int>();
@@ -117,10 +120,9 @@
        if (animState == null) return null;
        
        // 使用轨道9作为死亡动画专用轨道(独立于主轨道0和子技能轨道1-8)
        const int deathTrackIndex = 9;
        
        // 清除死亡轨道上的回调
        if (activeSkillTracks.TryGetValue(deathTrackIndex, out var oldDeathTrack))
        if (activeSkillTracks.TryGetValue(DeathTrackIndex, out var oldDeathTrack))
        {
            if (trackEntryCallbacks.ContainsKey(oldDeathTrack))
                trackEntryCallbacks.Remove(oldDeathTrack);
@@ -134,11 +136,11 @@
            return null;
        }
        
        Spine.TrackEntry deathTrack = animState.SetAnimation(deathTrackIndex, deadAnim, false);
        Spine.TrackEntry deathTrack = animState.SetAnimation(DeathTrackIndex, deadAnim, false);
        
        if (deathTrack != null)
        {
            activeSkillTracks[deathTrackIndex] = deathTrack;
            activeSkillTracks[DeathTrackIndex] = deathTrack;
            
            if (onComplete != null)
                trackEntryCallbacks[deathTrack] = onComplete;
@@ -149,6 +151,14 @@
    private void AddAction(Action action) => runningActions.Add(action);
    private void RemoveAction(Action action) => runningActions.Remove(action);
    // 检查是否有活跃的技能轨道(排除死亡轨道)
    private bool HasActiveSkillTracks()
    {
        if (activeSkillTracks.Count == 0) return false;
        if (activeSkillTracks.Count == 1 && activeSkillTracks.ContainsKey(DeathTrackIndex)) return false;
        return true;
    }
    public Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, bool isSubSkill, Action onComplete = null)
    {
@@ -306,8 +316,8 @@
                    subSkillTrackMap.Remove(skillBase);
                }
                
                // 只有当没有其他活跃技能时才复位 playingSkillAnim
                if (activeSkillTracks.Count == 0)
                // 只有当没有其他活跃技能时才复位 playingSkillAnim(排除死亡轨道)
                if (!HasActiveSkillTracks())
                {
                    playingSkillWithAnim = false;
                    playingSkill = false;
@@ -360,7 +370,7 @@
                        subSkillTrackMap.Remove(skillBase);
                    }
                    
                    if (activeSkillTracks.Count == 0)
                    if (!HasActiveSkillTracks())
                    {
                        playingSkill = false;
                        playingSkillWithAnim = false;
@@ -371,7 +381,7 @@
                if (skillTrack.TrackTime == 0) failCount++;
                if (failCount > 100)
                {
                    Debug.LogError("技能动画播放失败,强制结束 " + skillConfig.SkillID);
                    Debug.LogError("技能动画播放失败,强制结束 " + skillConfig.SkillID + " is caster dead " + skillBase.caster.IsDead());
                    skillBase.ForceFinished();
                    RemoveAction(frameHandler);
                    if (activeSkillTracks.ContainsKey(trackIndex))
@@ -385,7 +395,7 @@
                        subSkillTrackMap.Remove(skillBase);
                    }
                    
                    if (activeSkillTracks.Count == 0)
                    if (!HasActiveSkillTracks())
                    {
                        playingSkillWithAnim = false;
                        playingSkill = false;
@@ -480,8 +490,8 @@
                        subSkillTrackMap.Remove(skillBase);
                    }
                    // 只有当没有其他活跃技能时才复位 playingSkillAnim
                    if (activeSkillTracks.Count == 0)
                    // 只有当没有其他活跃技能时才复位 playingSkillAnim(排除死亡轨道)
                    if (!HasActiveSkillTracks())
                    {
                        playingSkill = false;
                    }