yyl
6 天以前 7124d5404ae57ed56548ec8186ea038a0cb85e2e
125 战斗 修复吕玲绮动作卡死的问题 带着特效控制特效攻击的问题
5个文件已修改
146 ■■■■ 已修改文件
Main/System/Battle/Buff/BattleObjectBuffMgr.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Define/BattleDmgInfo.cs 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Motion/MotionBase.cs 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/RecordPlayer/RecordPlayer.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/SkillBase.cs 94 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Buff/BattleObjectBuffMgr.cs
@@ -147,7 +147,7 @@
            OnBuffChanged();
        });
        battleObject.battleField.recordPlayer.PlayRecord(buffRemoveAction);
        battleObject.battleField.recordPlayer.ImmediatelyPlay(buffRemoveAction);
        
    }
Main/System/Battle/Define/BattleDmgInfo.cs
@@ -521,13 +521,20 @@
    {
        get
        {
            return casterObj != null ? casterObj.teamHero.maxHp : 0;
            if (null == casterObj)
                return 0;
            if (null == casterObj.teamHero)
                return 0;
            return casterObj.teamHero.maxHp;
        }
        set
        {
            if (casterObj != null)
            {
                casterObj.teamHero.maxHp = value;
                if (casterObj.teamHero != null)
                    casterObj.teamHero.maxHp = value;
            }
        }
    }
Main/System/Battle/Motion/MotionBase.cs
@@ -108,8 +108,6 @@
    public virtual Spine.TrackEntry PlayDeadAnimation(Action onComplete = null)
    {
        if (animState == null) return null;
        CancelControledAnimation();
        
        // 使用轨道9作为死亡动画专用轨道(独立于主轨道0和子技能轨道1-8)
        const int deathTrackIndex = 9;
@@ -401,11 +399,17 @@
                {
                    finalEnded = true;
                    // 清理技能轨道
                    // 清理技能轨道 - 从字典中移除
                    if (skillTrack != null && activeSkillTracks.ContainsKey(trackIndex))
                    {
                        if (activeSkillTracks[trackIndex] == skillTrack)
                            activeSkillTracks.Remove(trackIndex);
                    }
                    // 【关键修复】清除 animState 中的轨道,防止高编号轨道的最后一帧覆盖低编号轨道
                    if (trackIndex > 0)
                    {
                        animState?.ClearTrack(trackIndex);
                    }
                    // 回收子技能轨道
@@ -494,6 +498,14 @@
        //  这里是受到硬控时候 需要表现的动画
        var entry = PlayAnimation(MotionName.hit, false);
        if (entry == null)
        {
            // playingSkillAnim || animState == null
            Debug.LogError("SetControledAnimation PlayAnimation hit failed : reason : " + (playingSkillAnim ? "playingSkillAnim" : "animState == null"));
            return;
        }
        float threeFrameTrackTime = 3f / BattleConst.skillMotionFps;
        entry.TrackTime = threeFrameTrackTime;
        entry.TimeScale = 0;
@@ -506,7 +518,18 @@
    {
        //  硬控结束,恢复动画播放
        isUnderControl = false;
        PlayAnimation(MotionName.idle, true);
        // 恢复所有轨道的时间缩放
        foreach (var key in animState.Tracks)
        {
            if (key != null)
                key.TimeScale = 1f;
        }
        // 重置骨骼到初始姿态,防止 hit 动画的姿态残留
        skeleton?.SetToSetupPose();
        var entry = PlayAnimation(MotionName.idle, true);
    }
    public virtual void Run()
Main/System/Battle/RecordPlayer/RecordPlayer.cs
@@ -34,6 +34,7 @@
    public void PlayRecord(RecordAction recordAction)
    {
        if (recordAction == null) return;
        BattleDebug.LogError("Enqueue record action " + recordAction.GetType());
        if (isForceFinish)
        {
@@ -53,6 +54,7 @@
    public void InsertRecord(RecordAction recordAction)
    {
        if (recordAction == null) return;
        if (isForceFinish)
        {
            recordAction.ForceFinish();
@@ -78,6 +80,7 @@
    public void ImmediatelyPlay(RecordAction recordAction)
    {
        if (recordAction == null) return;
        if (isForceFinish)
        {
            recordAction.ForceFinish();
@@ -95,6 +98,11 @@
            for (int i = immediatelyActionList.Count - 1; i >= 0; i--)
            {
                var action = immediatelyActionList[i];
                if (action == null)
                {
                    removeIndexList.Add(i);
                    continue;
                }
                if (!action.IsFinished())
                {
                    action.Run();
Main/System/Battle/Skill/SkillBase.cs
@@ -36,7 +36,8 @@
    private Dictionary<int, BattleDrops> tempDropList = new Dictionary<int, BattleDrops>();
    private Dictionary<int, BattleDeadPack> tempDeadPackList = new Dictionary<int, BattleDeadPack>();
    protected List<HB428_tagSCBuffRefresh> buffCollections = new List<HB428_tagSCBuffRefresh>();
    // Buff相关包集合,支持 HB428(刷新) 和 HB429(删除)
    protected List<GameNetPackBasic> buffPackCollections = new List<GameNetPackBasic>();
    // 构造函数:初始化技能基础数据
@@ -1113,9 +1114,6 @@
            {
                caster.motionBase?.ResetForReborn(false);
            }
            // 清理动画回调
            caster.motionBase?.CancelControledAnimation();
        }
        // 5. 恢复 UI 状态
@@ -1144,12 +1142,9 @@
        isPlay = true;
        // 6. 处理所有剩余包(包括 buff 包)
        // 先处理 buffCollections
        foreach (var buff in buffCollections)
        {
            PackageRegedit.Distribute(buff);
        }
        buffCollections.Clear();
        // 先处理 buffPackCollections
        DistributeBuffPacks(buffPackCollections);
        buffPackCollections.Clear();
        // 处理剩余的 packList
        while (packList.Count > 0)
@@ -1245,16 +1240,16 @@
                otherSkillActionList.Add(otherSkillAction);
                return false;
            }
            else if (pack is HB428_tagSCBuffRefresh buffRefresh)
            else if (IsBuffPack(pack))
            {
                //    从找到第一个HB428开始 找出连续的HB428_tagSCBuffRefresh包 如果找到一个B428后 之后碰到非HB428包就停止
                buffCollections.Add(buffRefresh);
                // 从找到第一个 Buff 包开始,收集连续的 HB428/HB429 包
                buffPackCollections.Add(pack);
                while (packList.Count > 0)
                {
                    var nextPack = packList[0];
                    if (nextPack is HB428_tagSCBuffRefresh nextBuffRefresh)
                    if (IsBuffPack(nextPack))
                    {
                        buffCollections.Add(nextBuffRefresh);
                        buffPackCollections.Add(nextPack);
                        packList.RemoveAt(0);
                    }
                    else
@@ -1263,18 +1258,11 @@
                    }
                }
                // 同时刷新所有对象的buff,不分组
                foreach (var buff in buffCollections)
                {
                    BattleObject battleObj = battleField.battleObjMgr.GetBattleObject((int)buff.ObjID);
                    if (battleObj != null)
                    {
                        battleObj.buffMgr.RefreshBuff(buff, true);
                    }
                }
                // 处理所有收集到的 buff 包
                ProcessBuffPacks(buffPackCollections);
                // 清空已处理的buff集合
                buffCollections.Clear();
                // 清空已处理的 buff 集合
                buffPackCollections.Clear();
                continue;
            }
@@ -1299,9 +1287,63 @@
        otherSkillActionList?.Clear();
        dropPackList?.Clear();
        expPackList?.Clear();
        buffPackCollections?.Clear();
        
        skillEffect = null;
        packList = null;
    }
    #region Buff包处理
    /// <summary>
    /// 判断是否为 Buff 相关的包(HB428 或 HB429)
    /// </summary>
    protected bool IsBuffPack(GameNetPackBasic pack)
    {
        return pack is HB428_tagSCBuffRefresh || pack is HB429_tagSCBuffDel;
    }
    /// <summary>
    /// 处理收集到的 Buff 包列表(HB428 刷新 和 HB429 删除)
    /// </summary>
    protected void ProcessBuffPacks(List<GameNetPackBasic> buffPacks)
    {
        if (buffPacks == null || buffPacks.Count == 0) return;
        foreach (var pack in buffPacks)
        {
            if (pack is HB428_tagSCBuffRefresh buffRefresh)
            {
                BattleObject battleObj = battleField.battleObjMgr.GetBattleObject((int)buffRefresh.ObjID);
                if (battleObj != null)
                {
                    battleObj.buffMgr.RefreshBuff(buffRefresh, true);
                }
            }
            else if (pack is HB429_tagSCBuffDel buffDel)
            {
                BattleObject battleObj = battleField.battleObjMgr.GetBattleObject((int)buffDel.ObjID);
                if (battleObj != null)
                {
                    battleObj.buffMgr.RemoveBuff(buffDel);
                }
            }
        }
    }
    /// <summary>
    /// 强制分发 Buff 包(用于 ForceFinished 场景)
    /// </summary>
    protected void DistributeBuffPacks(List<GameNetPackBasic> buffPacks)
    {
        if (buffPacks == null || buffPacks.Count == 0) return;
        foreach (var pack in buffPacks)
        {
            PackageRegedit.Distribute(pack);
        }
    }
    #endregion
}