yyl
2025-09-17 eb2fcb2536a8cce0b971f827c9232a138262b219
125 【战斗】战斗系统 boss战&战斗开始 倍速 跳过 暂停
11个文件已修改
2个文件已添加
344 ■■■■■ 已修改文件
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB424_tagSCTurnFightInit.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleConst.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/BattleField.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/BattleRootNode.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/StoryBossBattleField.cs 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleManager.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/FullScreenBattleWin.cs 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/FullScreenBattleWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/RecordPlayer/RecordPlayer.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/HomeWin.cs 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Team/TeamHero.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB424_tagSCTurnFightInit.cs
@@ -66,10 +66,25 @@
        BattleDebug.LogError("创建战场 guid:" + guid + " MapID:" + vNetData.MapID + " FuncLineID:" + vNetData.FuncLineID + "  " + battleField.GetType().ToString());
        if (vNetData.MapID == 1)
        {
        BattleWin battleWin = UIManager.Instance.GetUI<BattleWin>();
        if (null != battleWin)
        {
            battleWin.SetBattleField(battleField);
        }
    }
        else
        {
            FullScreenBattleWin fsBattleWin = UIManager.Instance.GetUI<FullScreenBattleWin>();
            if (null == fsBattleWin)
            {
                fsBattleWin = UIManager.Instance.OpenWindow<FullScreenBattleWin>();
            }
            fsBattleWin.SetBattleField(battleField);
        }
    }
}
Main/System/Battle/BattleConst.cs
@@ -25,6 +25,13 @@
    // 激活英雄后特效|激活英雄|激活英雄前特效
    // 应该如何管理层级?
    // RendererAdjuster如何替换EffectPenetrationBlocker?
    // RendererAdjuster应该不参与管理子RendererAdjuster
    // RendererAdjuster怎么联系起来
    public const int BattleBlackTransparentMaskOffset = 100;
@@ -38,6 +45,11 @@
            {
                return battleWin.GetSortingOrder();
            }
            FullScreenBattleWin fsBattleWin = UIManager.Instance.GetUI<FullScreenBattleWin>();
            if (fsBattleWin != null)
            {
                return fsBattleWin.GetSortingOrder();
            }
            return 0;
        }
    }
Main/System/Battle/BattleField/BattleField.cs
@@ -3,6 +3,7 @@
using System;
using LitJson;
using DG.Tweening;
using Codice.Client.BaseCommands;
public class BattleField
{
@@ -121,6 +122,7 @@
        SetBattleStartState();
        SetSpeedRatio(speedRatio);
        SetRootNodePosition();
    }
    public void SetSpeedRatio(float ratio)
@@ -326,6 +328,7 @@
    public virtual void Destroy()
    {
        ForceFinish();
        //  销毁全部内容
        BattleManager.Instance.DestroyBattleField(this);
    }
@@ -571,4 +574,22 @@
            Debug.LogError($"BattleObject with ID {vNetData.ObjID} not found for buff refresh.");
        }
    }
    public void SetRootNodePosition()
    {
        if (1 == MapID)
        {
            battleRootNode.imgBackground.rectTransform.anchoredPosition = new Vector2(0, -335f);
        }
        else
        {
            battleRootNode.imgBackground.rectTransform.anchoredPosition = new Vector2(0, -750f);
            // (battleRootNode.transform as RectTransform).anchoredPosition = new Vector2(100, 100);
        }
    }
    public void ForceFinish()
    {
        recordPlayer.HaveRest();
    }
}
Main/System/Battle/BattleField/BattleRootNode.cs
@@ -55,4 +55,6 @@
    public Transform skillFrontNode;
    public GameObject skillMaskNode;
    public GameObject battleStartNode;
}
Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs
@@ -23,14 +23,16 @@
        base.Run();
        Debug.Log("Battle Ended");
        onComplete?.Invoke();
        isFinish = true;
        onComplete?.Invoke();
    }
    public override void ForceFinish()
    {
        onComplete?.Invoke();
        if (isFinish)
            return;
        base.ForceFinish();
        onComplete?.Invoke();
    }
    public override bool IsFinished()
Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs
@@ -29,12 +29,16 @@
        battleField.StartBattle(() =>
        {
            isFinish = true;
            // 完成就开始显示UI
            EventBroadcast.Instance.Broadcast(EventName.DISPLAY_BATTLE_UI, battleField.guid, true);
            battleField.battleRootNode.battleStartNode.SetActive(true);
            UniTaskExtension.DelayTime((GameObject)null, 1f, () =>
            {
                isFinish = true;
                battleField.battleRootNode.battleStartNode.SetActive(false);
                EventBroadcast.Instance.Broadcast(EventName.DISPLAY_BATTLE_UI, battleField.guid, true);
            battleField.DistributeNextPackage();
        });
        });
        isRun = true;
    }
Main/System/Battle/BattleField/StoryBossBattleField.cs
@@ -77,9 +77,50 @@
    protected override void OnSettlement(JsonData turnFightStateData)
    {
        base.OnSettlement(turnFightStateData);
        AutoFightModel.Instance.isPause = false;
    }
    
    private void WhaleFall()
    {
        //  YYL TODO 应该需要一个结算界面来做这些内容
        UIManager.Instance.CloseWindow<FullScreenBattleWin>();
        AutoFightModel.Instance.isPause = false;
        Destroy();
    }
    public override void OnBattleEnd(JsonData turnFightStateData)
    {
        BattleEndAction battleEndAction = new BattleEndAction(this, turnFightStateData, () =>
        {
            BattleDebug.LogError(turnFightStateData.ToJson());
            // 这里可以添加战斗结束的具体逻辑
            OnSettlement(turnFightStateData);
            int winFaction = (int)turnFightStateData["winFaction"];
            //获胜阵营:   一般为1或者2,当玩家发起的战斗时,如果获胜阵营不等于1代表玩家失败了
            if (winFaction == 1)
            {
                Debug.LogError(guid + " : 战斗胜利");
                //  战斗胜利
            }
            else
            {
                //  战斗失败
                Debug.LogError(guid + " : 战斗失败");
            }
            IsBattleFinish = true;
            //提供外部 胜利等奖励显示
            EventBroadcast.Instance.Broadcast<string, JsonData>(EventName.BATTLE_END, guid, turnFightStateData);
            WhaleFall();
        });
        recordPlayer.PlayRecord(battleEndAction);
    }
    public override void HaveRest()
    {
Main/System/Battle/BattleManager.cs
@@ -485,9 +485,11 @@
    {
        try
        {
            foreach (var battleField in battleFields)
            List<string> keys = new List<string>(battleFields.Keys);
            for (int i = keys.Count - 1; i >= 0; i--)
            {
                battleField.Value?.Run();
                var battleField = battleFields[keys[i]];
                battleField?.Run();
            }
        }
        catch (System.Exception ex)
@@ -496,4 +498,16 @@
        }
    }
    public BattleField GetBattleFieldByMapID(int v)
    {
        foreach (var battleField in battleFields)
        {
            if (battleField.Value.MapID == v)
            {
                return battleField.Value;
            }
        }
        return null;
    }
}
Main/System/Battle/FullScreenBattleWin.cs
New file
@@ -0,0 +1,169 @@
using System;
using UnityEngine;
using UnityEngine.UI;
public class FullScreenBattleWin : UIBase
{
    float[] speedGear = { 1.1f, 1.3f, 1.5f };
    // 组件引用
    public Transform mountPoint;
    private BattleRootNode battleRootNode = null;
    public Button btnStop;
    private BattleField battleField;
    [SerializeField]
    private Button btnSpeed;
    [SerializeField]
    private Text textSpeed;
    [SerializeField]
    private Button btnPass;
    [SerializeField]
    private Button btnPause;
    // 生命周期
    protected override void InitComponent()
    {
        base.InitComponent();
        // 初始化组件引用 绑定按钮等UI组件事件
        btnStop.AddListener(PauseGame);
        btnSpeed.AddListener(ChangeSpeed);
        btnPass.AddListener(OnClickPass);
        btnPause.AddListener(OnClickPause);
    }
    private void OnClickPause()
    {
        if (null == battleField)
            return;
        battleField.IsPause = !battleField.IsPause;
    }
    private void OnClickPass()
    {
        if (null == battleField)
            return;
        battleField.ForceFinish();
    }
    private void ChangeSpeed()
    {
        if (null == battleField)
            return;
        int index = Array.IndexOf(speedGear, battleField.speedRatio);
        index = (index + 1) % speedGear.Length;
        battleField.SetSpeedRatio(speedGear[index]);
        textSpeed.text = (index + 1).ToString();
    }
    private void PauseGame()
    {
        // BattleDebug.LogError("PauseeGame");
        if (null == battleField)
            return;
        battleField.IsPause = !battleField.IsPause;
        BattleDebug.LogError(" is pause " + battleField.IsPause.ToString());
        // if (battleField != null)
        // {
        //     battleField.operationAgent.DoNext();
        // }
    }
    protected override void OnPreOpen()
    {
        base.OnPreOpen();
        // SetBattleField(BattleManager.Instance.storyBattleField);
        BattleManager.Instance.onBattleFieldCreate += OnCreateBattleField;
        UIManager.Instance.CloseWindow<MainWin>();
    }
    protected override void OnPreClose()
    {
        base.OnPreClose();
        UIManager.Instance.CloseWindow<BattleHUDWin>();
        BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField;
        UIManager.Instance.OpenWindow<MainWin>(0);
    }
    private void OnCreateBattleField(string arg1, BattleField field)
    {
        if (field.GetType() == battleField.GetType())
        {
            SetBattleField(field);
        }
    }
    protected override void OnOpen()
    {
        base.OnOpen();
    }
    protected override void OnClose()
    {
        base.OnClose();
        if (battleRootNode != null)
        {
            battleRootNode.transform.SetParent(Launch.Instance.transform);
            battleRootNode.transform.localPosition = new Vector3(-10000, -10000, 0);
        }
        battleField = null;
    }
    protected override void NextFrameAfterOpen()
    {
        base.NextFrameAfterOpen();
    }
    protected override void CompleteClose()
    {
        base.CompleteClose();
    }
    public void SetBattleField(BattleField _battleField)
    {
        battleField = _battleField;
        if (battleRootNode != null)
        {
            battleRootNode.transform.localPosition = Vector3.zero;
            battleRootNode.transform.SetParent(Launch.Instance.transform);
        }
        battleRootNode = battleField.battleRootNode;
        battleRootNode.transform.SetParent(mountPoint);
        battleRootNode.transform.localPosition = Vector3.zero;
        battleRootNode.transform.localScale = Vector3.one;
        BattleHUDWin ui = UIManager.Instance.GetUI<BattleHUDWin>();
        if (null == ui)
        {
            ui = UIManager.Instance.OpenWindow<BattleHUDWin>();
        }
        ui.SetBattleField(battleField);
        battleField.UpdateCanvas(canvas);
        textSpeed.text = (Array.IndexOf(speedGear, battleField.speedRatio) + 1).ToString();
    }
}
Main/System/Battle/FullScreenBattleWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b6123261c7e438e46a128ac22a8dbf9b
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Battle/RecordPlayer/RecordPlayer.cs
@@ -156,6 +156,11 @@
    public void HaveRest()
    {
        ForceFinish();
    }
    public void ForceFinish()
    {
        for (int i = 0; i < immediatelyActionList.Count; i++)
        {
            immediatelyActionList[i].ForceFinish();
Main/System/Main/HomeWin.cs
@@ -59,10 +59,7 @@
    protected override void InitComponent()
    {
        taskButton.AddListener(OnClickTaskButton);
        bossBtn.AddListener(() =>
        {
            UIManager.Instance.OpenWindow<MainBossEnterWin>();
        });
        bossBtn.AddListener(OnClickEnterBoss);
        changeHeroPosBtn.AddListener(() =>
        {
@@ -146,6 +143,20 @@
        UIManager.Instance.CloseWindow<BattleWin>();
    }
    private void OnClickEnterBoss()
    {
        BattleField battleField = BattleManager.Instance.GetBattleFieldByMapID(2); //BOSS战斗
        if (null != battleField)
        {
            FullScreenBattleWin fsBattleWin = UIManager.Instance.OpenWindow<FullScreenBattleWin>();
            fsBattleWin.SetBattleField(battleField);
            return;
        }
        UIManager.Instance.OpenWindow<MainBossEnterWin>();
    }
    void PlayerDataRefresh(PlayerDataType type)
    {
        switch (type)
Main/System/Team/TeamHero.cs
@@ -22,11 +22,10 @@
    public int positionNum; //注意服务端的1号位是1,客户端在使用时是0,通信和策划沟通用1
    //  战场数据
    public int ObjID = 0;// 战斗单位唯一ID
    public int NPCID = 0;// 战斗NPCID,不同的实例ID对应的NPCID可能一样
    public int NPCID = 0;// 战斗NPCID,不同的实例ID对应的NPCID可能一样 (目前只用来区别玩家跟NPC)
    //  服务器来的构造
@@ -56,16 +55,6 @@
            SkinID = (int)fightObj.SkinID;
            modelScale = 1f;
            name = heroConfig.Name;
        }
        else if (fightObj.NPCID > 0)
        {
            //走NPC的逻辑
            NPCConfig npcConfig = NPCConfig.Get((int)fightObj.NPCID);
            Country = (HeroCountry)npcConfig.Country;
            SkinID = npcConfig.SkinID;
            modelScale = npcConfig.ModelScale;
            name = npcConfig.NPCName;
            
        }
        else