yyl
2025-09-11 9919c1f6f91d61e576ea37b459e489a790a89407
125 【战斗】战斗系统 Boss战 &血条(表现待优化) &闪避 &子弹问题
18个文件已修改
4个文件已添加
545 ■■■■ 已修改文件
Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB418_tagSCObjPropertyRefreshView.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB424_tagSCTurnFightInit.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/BattleField.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/OperationAgent/RecordModeOperationAgent.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/DodgeFinishAction.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/DodgeFinishAction.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/StoryBossBattleField.cs 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/StoryBossBattleField.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleFieldFactory.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleManager.cs 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObject.cs 75 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Motion/MotionBase.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/RecordPlayer/RecordActionType.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/RecordPlayer/RecordPlayer.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/SkillBase.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/BulletSkillEffect.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/UIComp/BattleHeroInfoBar.cs 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Team/TeamHero.State.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs
@@ -197,6 +197,9 @@
            HB427_tagSCUseSkill skill = packList[0] as HB427_tagSCUseSkill;
            packList.Remove(skill);
            BattleObject _caster = battleField.battleObjMgr.GetBattleObject((int)skill.ObjID);
            // BattleDebug.LogError("_caster == null : " + (_caster == null) + " skill.ObjID : " + skill.ObjID);
            SkillRecordAction skillAction = new SkillRecordAction(battleField, _caster, skill, packList);
            return skillAction;
        }
Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs
@@ -10,15 +10,15 @@
        base.Done(vNetPack);
        H0418_tagObjInfoRefresh vNetData = vNetPack as H0418_tagObjInfoRefresh;
        // 0 - NPC(武将或怪物)
        // 1 - 玩家(主公)
        // 2 - NPC(武将或怪物)
        switch (vNetData.ObjType)
        {
            case 1:
                Update0418(vNetData);
                break;
            case 2:
            case 0:
                UpdateBattleField(vNetData);
                break;
            default:
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB418_tagSCObjPropertyRefreshView.cs
@@ -4,8 +4,16 @@
// B4 18 对象属性刷新展示 #tagSCObjPropertyRefreshView
public class DTCB418_tagSCObjPropertyRefreshView : DtcBasic {
    public override void Done(GameNetPackBasic vNetPack) {
    public override void Done(GameNetPackBasic vNetPack)
    {
        base.Done(vNetPack);
        HB418_tagSCObjPropertyRefreshView vNetData = vNetPack as HB418_tagSCObjPropertyRefreshView;
        BattleField battleField = BattleManager.Instance.GetBattleField(vNetData.packUID);
        if (null != battleField)
        {
            battleField.ObjPropertyRefreshView(vNetData);
            battleField.DistributeNextPackage();
        }
    }
}
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB424_tagSCTurnFightInit.cs
@@ -63,5 +63,13 @@
        BattleField battleField = BattleManager.Instance.CreateBattleField(guid, (int)vNetData.MapID, (int)vNetData.FuncLineID, extendData, redTeamList, blueTeamList);
        BattleStartAction battleStartAction = new BattleStartAction(battleField);
        battleField.recordPlayer.PlayRecord(battleStartAction);
        BattleDebug.LogError("创建战场 guid:" + guid + " MapID:" + vNetData.MapID + " FuncLineID:" + vNetData.FuncLineID + "  " + battleField.GetType().ToString());
        BattleWin battleWin = UIManager.Instance.GetUI<BattleWin>();
        if (null != battleWin)
        {
            battleWin.SetBattleField(battleField);
        }
    }
}
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs
@@ -2,10 +2,12 @@
using System.Collections;
using System;
using System.Text;
using System.Collections.Generic;
// B4 30 查看战报结果 #tagSCTurnFightReportRet
public class DTCB430_tagSCTurnFightReport : DtcBasic {
public class DTCB430_tagSCTurnFightReport : DtcBasic
{
    static byte[] vCmdBytes = new byte[2];
@@ -24,6 +26,8 @@
            int vLeavingLeng = 0;
            int vBodyLeng = 0;
            int vTotalLeng = vNetData.reportBytes.Length;
            List<GameNetPackBasic> vPackList = new List<GameNetPackBasic>();
            while (vReadIndex < vTotalLeng)
            {
@@ -52,10 +56,11 @@
                if (PackageRegedit.Contain(cmd))
                {
                    GameNetPackBasic vNetpack = PackageRegedit.TransPack(ServerType.B430, cmd, vPackBytes);
                    if (vNetpack != null)
                    GameNetPackBasic npk = PackageRegedit.TransPack(ServerType.B430, cmd, vPackBytes);
                    if (npk != null)
                    {
                        BattleManager.Instance.PushPackage(guid, vNetpack);
                        vPackList.Add(npk);
                        BattleManager.Instance.PushPackUID(guid, npk.packUID);
                        isRegist = true;
                    }
                }
@@ -70,10 +75,89 @@
#endif
                }
            }
            vPackList = AnalysisPackQueueAndDistribute(guid, vPackList);
            for (int i = 0; i < vPackList.Count; i++)
            {
                BattleManager.Instance.PushPackage(guid, vPackList[i]);
            }
            BattleManager.Instance.DistributeNextReportPackage(guid);
        }
        catch (Exception e)
        {
            Debug.LogErrorFormat("DTCB430_tagSCTurnFightReport 解包异常:{0}", e);
        }
    }
    protected List<GameNetPackBasic> AnalysisPackQueueAndDistribute(string guid, List<GameNetPackBasic> vPackList)
    {
        // 建议前端做一个防范机制:当连续多次请求得到空的战斗片段封包时(不包含B425标记的开始跟结束封包,即开始跟中间没有任何封包),强制自动帮玩家回城休息,
        // 原因可能前后端数据不一致bug(比如战锤可能后端没有了,前端认为还有)或者 后端有bug导致没有处理战斗
        // 为防止死循环,可强制回城休息,让玩家重新点击关卡战斗或挑战boss,
        // 正常情况下在战锤足够时理论上都可以一直循环刷怪,如果连续多次没有战斗片段封包,比如限制个连续10次以内,就可以理解为异常了
        const int MaxContinousEmptyCount = 10; // 连续空包最大次数
        List<GameNetPackBasic> packQueueSnapshot = new List<GameNetPackBasic>(vPackList);
        List<GameNetPackBasic> newPackList = new List<GameNetPackBasic>();
        HashSet<int> skipIndexes = new HashSet<int>();
        // 这里已经是按照Dequeue的顺序了
        for (int i = 0; i < packQueueSnapshot.Count; i++)
        {
            if (skipIndexes.Contains(i)) continue;
            GameNetPackBasic pack = packQueueSnapshot[i];
            // 碰到B421 截断 往下收集b421里的全部内容
            if (pack is HB421_tagMCTurnFightObjAction)
            {
                HB421_tagMCTurnFightObjAction b421Pack = pack as HB421_tagMCTurnFightObjAction;
                List<GameNetPackBasic> b421PackList = new List<GameNetPackBasic>();
                i++;    // 跳过当前的B421包
                // 收集所有非B421包,直到遇到下一个B421或队列结束
                for (; i < packQueueSnapshot.Count; i++)
                {
                    GameNetPackBasic nextPack = packQueueSnapshot[i];
                    if (nextPack is HB421_tagMCTurnFightObjAction)
                    {
                        i--; // 回退一个位置,留给外层循环处理
                        break;
                    }
                    else
                    {
                        b421PackList.Add(nextPack);
                        skipIndexes.Add(i); // 标记已被合包
                    }
                }
                // 合并所有相关包
                CustomB421ActionPack actionPack = CustomB421ActionPack.CreateB421ActionPack(guid, b421PackList);
                newPackList.Add(actionPack);
            }
            else
            {
                newPackList.Add(pack);
            }
        }
        List<GameNetPackBasic> returnList = new List<GameNetPackBasic>();
        for (int i = 0; i < newPackList.Count; i++)
        {
            var pack = newPackList[i];
            returnList.Add(pack);
        }
        return returnList;
    }
}
Main/System/Battle/BattleField/BattleField.cs
@@ -439,13 +439,13 @@
            if (winFaction == 1)
            {
                Debug.LogError("战斗胜利");
                Debug.LogError(guid + " : 战斗胜利");
                //  战斗胜利
            }
            else
            {
                //  战斗失败
                Debug.LogError("战斗失败");
                Debug.LogError(guid + " : 战斗失败");
            }
            IsBattleFinish = true;
Main/System/Battle/BattleField/OperationAgent/RecordModeOperationAgent.cs
@@ -17,16 +17,22 @@
    public override void Run()
    {
        base.Run();
        DoNext();
    }
    public override void DoNext()
    {
        base.DoNext();
        // if (!playing())
        //     packs.Dequeue();
        //     actions = pack.Distribute();
        // recordPlayer.Play(actions);
        if (battleField.IsBattleEnd())
        {
            return;
        }
        if (!battleField.recordPlayer.IsPlaying())
        {
            battleField.DistributeNextPackage();
        }
    }
}
Main/System/Battle/BattleField/RecordActions/DodgeFinishAction.cs
New file
@@ -0,0 +1,40 @@
using UnityEngine;
using System.Collections.Generic;
public class DodgeFinishAction : RecordAction
{
    private bool isRun = false;
    public DodgeFinishAction(BattleField _battleField, BattleObject _dodgeObj)
        : base(RecordActionType.DodgeFinish, _battleField, null)
    {
    }
    public override bool IsFinished()
    {
        return isFinish;
    }
    public override void Run()
    {
        base.Run();
        if (isRun)
            return;
        battleObject.OnDodgeEnd();
        isFinish = true;
        isRun = true;
    }
    public override void ForceFinish()
    {
        //正常开始之后到界面出现之前都点不了 所以这边不用强制完成 接口留着
        base.ForceFinish();
        // 完成就开始显示UI
    }
}
Main/System/Battle/BattleField/RecordActions/DodgeFinishAction.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7099a0a534efb71459ccf57d9a8bc393
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
@@ -10,6 +10,8 @@
    public SkillRecordAction(BattleField _battleField, BattleObject _caster, HB427_tagSCUseSkill vNetData, List<GameNetPackBasic> packList)
        : base(RecordActionType.Skill, _battleField, _caster)
    {
        // Debug.LogError("_caster == null : " + (_caster == null));
        skillBase = SkillFactory.CreateSkill(_caster, vNetData, packList, _battleField);
    }
Main/System/Battle/BattleField/StoryBossBattleField.cs
New file
@@ -0,0 +1,115 @@
using System;
using LitJson;
using UnityEngine;
using System.Collections.Generic;
public class StoryBossBattleField : BattleField
{
    protected int chapter;//   章节
    protected int wave;//  波数
    protected int level;// 关卡
    protected JsonData extendData;
    protected MainChapterConfig chapterConfig;
    protected MainLevelConfig levelConfig;
    public StoryBossBattleField(string _guid) : base(_guid)
    {
    }
    public override void Init(int MapID, int FuncLineID, JsonData _extendData,
        List<TeamBase> _redTeamList, List<TeamBase> _blueTeamList)
    {
        base.Init(MapID, FuncLineID, extendData, _redTeamList, _blueTeamList);
        chapter = FuncLineID / 10000;
        wave = MapID == 1 ? FuncLineID % 100 : 1;//第几波怪
        level = (FuncLineID % 10000) / 100;
        extendData = _extendData;
        chapterConfig = MainChapterConfig.Get(chapter);
        levelConfig = MainLevelConfig.Get(level);
        SetBattleMode(BattleMode.Record);
    }
    public override void Release()
    {
        base.Release();
    }
    public override void AutoSetBattleMode()
    {
        SetBattleMode(BattleMode.Record);
    }
    public override void TurnFightState(int TurnNum, int State,
        uint FuncLineID, JsonData extendData)
    {
        base.TurnFightState(TurnNum, State, FuncLineID, extendData);
        switch (State)
        {
            //  起始状态标记
            case 0:
                break;
            case 1://准备完毕
                break;
            case 2://战斗中
                break;
            case 3://战斗结束
                break;
            case 4://结算奖励
                break;
            case 5://结束状态标记
                break;
            default:
                BattleDebug.LogError("recieve a unknown State");
                break;
        }
    }
    protected override void OnSettlement(JsonData turnFightStateData)
    {
        base.OnSettlement(turnFightStateData);
    }
    public override void HaveRest()
    {
        //  主线BOSS战斗没有休息
    }
    // public override void OnBattleEnd(JsonData turnFightStateData)
    // {
    //     base.OnBattleEnd(turnFightStateData);
    //     // HaveRest();
    // }
    public override void Run()
    {
        if (operationAgent == null)
        {
            //防范异常
            return;
        }
        base.Run();
    }
    public override void DistributeNextPackage()
    {
        if (IsBattleFinish)
            return;
        //  不要调用base的函数
        BattleManager.Instance.DistributeNextReportPackage(guid);
    }
}
Main/System/Battle/BattleField/StoryBossBattleField.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 15d8291560cdd1449be24332792c7379
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Battle/BattleFieldFactory.cs
@@ -15,9 +15,11 @@
        switch (MapID)
        {
            case 1:
            case 2:
                battleField = new StoryBattleField();
                break;
            case 2:
                battleField = new StoryBossBattleField(guid);
                break;
            default:
                break;
        }
Main/System/Battle/BattleManager.cs
@@ -289,6 +289,7 @@
        if (!battleReportDict.TryGetValue(guid, out queue))
        {
            queue = new Queue<GameNetPackBasic>();
            battleReportDict.Add(guid, queue);
        }
        queue.Enqueue(vNetPack);
@@ -301,7 +302,26 @@
            battlePackRelationList.Add(guid, uidList);
        }
        uidList.Add(vNetPack.packUID);
        if (!uidList.Contains(vNetPack.packUID))
        {
            uidList.Add(vNetPack.packUID);
        }
    }
    public void PushPackUID(string guid, ulong packUID)
    {
        List<ulong> uidList = null;
        if (!battlePackRelationList.TryGetValue(guid, out uidList))
        {
            uidList = new List<ulong>();
            battlePackRelationList.Add(guid, uidList);
        }
        if (!uidList.Contains(packUID))
        {
            uidList.Add(packUID);
        }
    }
    public BattleField GetBattleField(ulong packUID)
@@ -332,6 +352,7 @@
    {
        Queue<GameNetPackBasic> queue = null;
        if (!battleReportDict.TryGetValue(guid, out queue))
        {
            BattleDebug.LogError("DistributeNextReportPackage could not find queue for guid : " + guid);
@@ -340,7 +361,32 @@
        var pack = queue.Dequeue();
        PackageRegedit.Distribute(pack);
        // Debug.LogError("DistributeNextReportPackage for guid : " + guid + " pack type : " + pack.GetType());
        try
        {
            if (pack is CustomHB426CombinePack combinePack)
            {
                combinePack.Distribute();
            }
            else if (pack is CustomB421ActionPack actionPack)
            {
                actionPack.Distribute();
            }
            else
            {
                PackageRegedit.Distribute(pack);
            }
        }
        catch (Exception ex)
        {
            Debug.LogError("DistributeNextPackage: 分发包异常 " + ex);
            // 出错时主动移除当前包,防止死循环
            if (packQueue.Count > 0)
            {
                packQueue.Dequeue();
            }
        }
        if (queue.Count <= 0)
        {
@@ -397,14 +443,13 @@
            return;
        }
        onBattleFieldDestroy?.Invoke(battleField.guid, battleField);
        battleField.Release();
        string guid = battleField.guid;
        if (battleFields.ContainsKey(guid))
        {
            battleFields.Remove(guid);
        }
        battleFields.Remove(guid);
        battleReportDict.Remove(guid);
        battlePackRelationList.Remove(guid);
        if (storyBattleField == battleField)
        {
@@ -412,6 +457,9 @@
        }
        GameObject.DestroyImmediate(battleField.battleRootNode.gameObject);
        onBattleFieldDestroy?.Invoke(battleField.guid, battleField);
    }
Main/System/Battle/BattleObject/BattleObject.cs
@@ -97,7 +97,8 @@
        var heroInfoBarScale = heroInfoBar.transform.localScale;
        heroInfoBarScale.x *= Camp == BattleCamp.Red ? 1 : -1;
        heroInfoBar.transform.localScale = heroInfoBarScale;
        heroInfoBar.SetActive(true);
    }
@@ -144,14 +145,39 @@
                break;
            case PlayerDataType.MaxHP:
                teamHero.maxHp = GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx);
                heroInfoBar.UpdateHP(teamHero.curHp, teamHero.curHp, teamHero.maxHp);
                break;
            case PlayerDataType.XP:
                long toXp = GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx);
                heroInfoBar.UpdateHP(teamHero.rage, toXp, 100);
                heroInfoBar.UpdateXP(teamHero.rage, toXp, 100);
                teamHero.rage = (int)GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx);
                break;
            default:
                Debug.LogError("BattleObject.ObjInfoRefresh 出现意外类型 " + _refreshInfo.RefreshType.ToString());
                break;
        }
    }
    public void ObjPropertyRefreshView(HB418_tagSCObjPropertyRefreshView vNetData)
    {
        switch ((PlayerDataType)vNetData.RefreshType)
        {
            case PlayerDataType.HP:
                long toHp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
                heroInfoBar.UpdateHP(teamHero.curHp, toHp, teamHero.maxHp);
                teamHero.curHp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
                break;
            case PlayerDataType.MaxHP:
                teamHero.maxHp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
                heroInfoBar.UpdateHP(teamHero.curHp, teamHero.curHp, teamHero.maxHp);
                break;
            case PlayerDataType.XP:
                long toXp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
                heroInfoBar.UpdateXP(teamHero.rage, toXp, 100);
                teamHero.rage = (int)GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
                break;
            default:
                Debug.LogError("BattleObject.ObjPropertyRefreshView 出现意外类型 " + vNetData.RefreshType.ToString());
                break;
        }
    }
@@ -241,12 +267,10 @@
    public virtual void Hurt(List<long> damageValues, long _totalDamage, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig)
    {
        PopDamage(damageValues, hurt, skillConfig);
        PopDamage(damageValues, _totalDamage, hurt, skillConfig);
        motionBase.PlayAnimation(MotionName.hit, false);
        //  扣血流给别的敌方刷新好了
        teamHero.curHp -= _totalDamage;
    }       
    public void SuckHp(uint suckHP, SkillConfig skillConfig)
@@ -264,14 +288,14 @@
    {
        float pingpongTime = 0.2f;
        RectTransform rectTrans = heroRectTrans;
        var tween = rectTrans.DOAnchorPos(new Vector3(-50, 50, 0), pingpongTime)
        var tween = rectTrans.DOAnchorPos(new Vector3(-30, 0, 0), pingpongTime)
            .SetEase(Ease.OutCubic);
        battleField.battleTweenMgr.OnPlayTween(tween);
    }
    //  闪避结束
    public virtual void OnDodgeEnd()
    public virtual void OnDodgeEnd(Action _complete = null)
    {
        float pingpongTime = 0.2f;
        RectTransform rectTrans = heroRectTrans;
@@ -279,23 +303,28 @@
        var tween = rectTrans.DOAnchorPos(Vector3.zero, pingpongTime)
                            .SetEase(Ease.OutCubic);
        tween.onComplete += () =>
        {
            _complete?.Invoke();
        };
        battleField.battleTweenMgr.OnPlayTween(tween);
    }
    public virtual void OnDeath(Action _onDeathAnimationComplete)
    {
        onDeathAnimationComplete = _onDeathAnimationComplete;
        motionBase.PlayAnimation(MotionName.dead, false);
        motionBase.PlayAnimation(MotionName.dead, false, () =>
        {
            teamHero.isDead = true;
            OnDeadAnimationComplete();
            _onDeathAnimationComplete?.Invoke();
        });
    }
    //  不一定可靠 有时候会插入其他动作就完了
    protected virtual void OnAnimationComplete(string motionName)
    {
        if (motionName == MotionName.dead.ToString().ToLower())
        {
            OnDeadAnimationComplete();
            onDeathAnimationComplete?.Invoke();
            onDeathAnimationComplete = null;
        }
    }
    protected virtual void OnDeadAnimationComplete()
@@ -313,9 +342,19 @@
    }
    // 伤害还要看 是否闪避 暴击 and so on 需要有一个DamageType 服务器应该会给
    protected virtual void PopDamage(List<long> damageValues, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig)
    protected virtual void PopDamage(List<long> damageValues, long _totalDamage, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig)
    {
        BattleDmgInfo battleDmgInfo = new BattleDmgInfo(battleField.guid, damageValues, this, hurt, skillConfig);
        if (battleDmgInfo.IsType(DamageType.Dodge))
        {
            OnDodgeBegin();
            DodgeFinishAction dodgeFinish = new DodgeFinishAction(battleField, this);
            battleField.recordPlayer.InsertRecord(dodgeFinish);
        }
        heroInfoBar.UpdateHP(teamHero.curHp, Math.Max(0, teamHero.curHp - _totalDamage), teamHero.maxHp);
        teamHero.curHp = Math.Max(0, teamHero.curHp - _totalDamage);
        // YYL TODO 是否需要挂在在自身的follow点上
        EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleDmgInfo);
@@ -342,8 +381,10 @@
        //  休息状态
        //  多一个zzz的一个特效
        heroGo.SetActive(true);
        motionBase.PlayAnimation(MotionName.idle, true);
        motionBase.HaveRest();
        heroRectTrans.anchoredPosition = Vector2.zero;
        heroInfoBar.SetActive(false);
    }
    public void PushDropItems(BattleDrops _battleDrops)
Main/System/Battle/Motion/MotionBase.cs
@@ -83,6 +83,7 @@
    
    public virtual void Release()
    {
        trackEntryCompleteDict.Clear();
        if (spineAnimationState != null)
        {
            spineAnimationState.Complete -= OnAnimationComplete;
@@ -348,6 +349,12 @@
        skeletonGraphic.timeScale = MotionTimeScale;
    }
    public void HaveRest()
    {
        trackEntryCompleteDict.Clear();
        PlayAnimation(MotionName.idle, true);
    }
    #endregion
}
Main/System/Battle/RecordPlayer/RecordActionType.cs
@@ -8,4 +8,6 @@
    BuffMount,//挂载增益
    BattleStart,//战斗开始
    DodgeFinish,//闪避完成
}
Main/System/Battle/RecordPlayer/RecordPlayer.cs
@@ -13,7 +13,7 @@
    private bool isWaitingNextAction = false;
    private float waitTimer = 0f;
    private const float waitInterval = 0.2f;
    private const float waitInterval = 0f;
    public void Init(BattleField _battleField)
    {
Main/System/Battle/Skill/SkillBase.cs
@@ -120,8 +120,8 @@
                DashCast(OnAttackFinish);
                break;
            default:
                Debug.LogError("暂时不支持其他的方式释放 有需求请联系策划 技能id:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition);
                OnSkillFinished();
                Debug.LogError("强制结束技能 暂时不支持其他的方式释放 有需求请联系策划 技能id:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition);
                ForceFinished();
                break;
        }
@@ -131,6 +131,7 @@
    protected void DashCast(Action _onComplete)
    {
        Debug.LogError("DashCast 还没实现");
        ForceFinished();
        //    YYL TODO
        // var entry = caster.motionBase.PlayAnimation(skillConfig.GetMotionName(), false);
Main/System/Battle/SkillEffect/BulletSkillEffect.cs
@@ -66,6 +66,10 @@
                    case 5:
                        SelfShoting();
                        break;
                    default:
                        Debug.LogError("子弹特效没有配置正确的TagAim,强制结束子弹特效 TagAim: " + skillConfig.TagAim);
                        ForceFinished();
                        break;
                }
            }
        }
@@ -253,8 +257,31 @@
    private void VerticalRowShoting()
    {
        // 纵排分别为1、4,2、5,3、6,三组纵排,按对位规则选择,默认1号、2号或3号为主目标,前排1、2、3号位置全部死完后,4号、5号或6号为主目标
        BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
        //  攻击mininumIndex目标
        int minimumIndex = int.MaxValue;
        foreach (var hurt in tagUseSkillAttack.HurtList)
        {
            BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
            if (target == null)
            {
                Debug.LogError("特效目标为空 target == null ObjId : " + hurt.ObjID);
                continue;
            }
        ShotEachTargets();
            minimumIndex = Mathf.Min(target.teamHero.positionNum, minimumIndex);
        }
        if (minimumIndex != int.MaxValue)
        {
            ShotToIndex(battleCamp, minimumIndex);
        }
        else
        {
            Debug.LogError("纵排攻击没有目标 强制结束子弹特效");
            ForceFinished();
        }
    }
Main/System/Battle/UIComp/BattleHeroInfoBar.cs
@@ -23,7 +23,7 @@
    protected List<string> messages = new List<string>();
    public BasicHeroInfoContainer heroInfoContainer;
    public BattleTips textTips;
    protected Tween hpTween;
@@ -41,6 +41,8 @@
        battleObject = _battleObject;
        heroInfoContainer.SetHeroInfo(battleObject.teamHero);
        RefreshBuff(buffList);
        UpdateHP(battleObject.teamHero.curHp, battleObject.teamHero.curHp, battleObject.teamHero.maxHp, false);
        UpdateXP(battleObject.teamHero.rage, battleObject.teamHero.rage, 100, false);
    }
    public void RefreshBuff(List<HB428_tagSCBuffRefresh> datas)
@@ -114,7 +116,7 @@
    }
    public void UpdateHP(long fromHp, long toHp, long maxHp)
    public void UpdateHP(long fromHp, long toHp, long maxHp,  bool tween = true)
    {
        //  做hp增加或者减少的动画
        // sliderHp.value = ((float)fromHp) / ((float)maxHp);
@@ -122,13 +124,21 @@
        {
            battleObject.battleField.battleTweenMgr.OnKillTween(hpTween);
        }
        hpTween = sliderHp.DOValue((float)toHp / maxHp, 0.3f);
        battleObject.battleField.battleTweenMgr.OnPlayTween(hpTween);
        if (tween)
        {
            hpTween = sliderHp.DOValue((float)toHp / (float)maxHp, 0.3f);
            battleObject.battleField.battleTweenMgr.OnPlayTween(hpTween);
        }
        else
        {
            sliderHp.value = ((float)toHp) / ((float)maxHp);
        }
        BattleDebug.LogError("update hp from " + fromHp + " to " + toHp + " maxHp " + maxHp);
    }
    public void UpdateXP(long fromXp, long toXp, long maxXp)
    public void UpdateXP(long fromXp, long toXp, long maxXp, bool tween = true)
    {
        //  做Xp增加或者减少的动画
        // sliderXp.value = ((float)fromXp) / ((float)maxXp);
@@ -136,8 +146,17 @@
        {
            battleObject.battleField.battleTweenMgr.OnKillTween(xpTween);
        }
        xpTween = sliderHp.DOValue((float)toXp / maxXp, 0.2f);
        battleObject.battleField.battleTweenMgr.OnPlayTween(xpTween);
        if (tween)
        {
            xpTween = sliderXp.DOValue((float)toXp / (float)maxXp, 0.2f);
            battleObject.battleField.battleTweenMgr.OnPlayTween(xpTween);
        }
        else
        {
            sliderXp.value = ((float)toXp) / ((float)maxXp);
        }
        BattleDebug.LogError("update xp from " + fromXp + " to " + toXp + " maxXp " + maxXp);
    }
Main/System/Team/TeamHero.State.cs
@@ -24,10 +24,8 @@
    public bool isDead
    {
        get
        {
            return curHp <= 0;
        }
    }
        get;
        set;
    } = false;
}