using System.Collections.Generic; using LitJson; using UnityEngine; using UnityEngine.UI; public class ArenaBattleWin : UIBase { // 组件引用 [SerializeField] Transform mountPoint; [SerializeField] Transform transButtons; [SerializeField] Button btnSpeed; [SerializeField] Text textSpeed; [SerializeField] Button btnPass; [SerializeField] Button btnPause; private BattleRootNode battleRootNode = null; private BattleField battleField; [SerializeField] HeroCountryComponent myCountry; [SerializeField] TextEx txtMyLV; [SerializeField] TextEx txtMyName; [SerializeField] TextEx txtMyHp; [SerializeField] ImageEx imgMyHp; [SerializeField] TextEx txtMyFightPonit; [SerializeField] AvatarCell myAvatarCell; [SerializeField] List myHeroHeads; [SerializeField] HeroCountryComponent enemyCountry; [SerializeField] TextEx txtEnemyLV; [SerializeField] TextEx txtEnemyName; [SerializeField] TextEx txtEnemyHp; [SerializeField] ImageEx imgEnemyHp; [SerializeField] TextEx txtEnemyFightPonit; [SerializeField] AvatarCell enemyAvatarCell; [SerializeField] List enemyHeroHeads; [SerializeField] TextEx txtWaveInfo; public TotalDamageDisplayer totalDamageDisplayer; public SkillTips skillTipsRed; public SkillTips skillTipsBlue; // 生命周期 protected override void InitComponent() { base.InitComponent(); // 初始化组件引用 绑定按钮等UI组件事件 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; BattleManager.Instance.speedIndex = (BattleManager.Instance.speedIndex + 1) % BattleManager.Instance.speedGear.Length; battleField.SetSpeedRatio(BattleManager.Instance.speedGear[BattleManager.Instance.speedIndex]); textSpeed.text = (BattleManager.Instance.speedIndex + 1).ToString(); } protected override void OnPreOpen() { base.OnPreOpen(); MainWin.TabChangeEvent += OnTabChangeEvent; BattleManager.Instance.onBattleFieldCreate += OnCreateBattleField; EventBroadcast.Instance.AddListener(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken); EventBroadcast.Instance.AddListener(EventName.BATTLE_CAST_SKILL, OnCastSkill); EventBroadcast.Instance.AddListener(EventName.BATTLE_END, OnBattleEnd); BattleManager.Instance.storyBattleField.IsPause = true; bool isOpenBattleChangeTab = IsOpenBattleChangeTab(); transButtons.localPosition = new Vector3(0, isOpenBattleChangeTab ? 130 : 0, 0); if (isOpenBattleChangeTab) { UIManager.Instance.GetUI()?.CloseSubUI(); } else { UIManager.Instance.CloseWindow(); } } protected override void OnPreClose() { base.OnPreClose(); UIManager.Instance.CloseWindow(); MainWin.TabChangeEvent -= OnTabChangeEvent; BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField; EventBroadcast.Instance.RemoveListener(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken); EventBroadcast.Instance.RemoveListener(EventName.BATTLE_CAST_SKILL, OnCastSkill); EventBroadcast.Instance.RemoveListener(EventName.BATTLE_END, OnBattleEnd); BattleManager.Instance.storyBattleField.IsPause = false; bool isOpenBattleChangeTab = IsOpenBattleChangeTab(); if (isOpenBattleChangeTab) { UIManager.Instance.GetUI()?.RestoreSubUI(); } else { UIManager.Instance.OpenWindow(); } } private void OnTabChangeEvent() { UIManager.Instance.CloseWindow(); } private void OnBattleEnd(string guid, JsonData endData) { if (battleField != null && guid == battleField.guid) { DisplayHpInfo(); } } private void OnDamageTaken(BattleDmgInfo damageInfo) { if (battleField == null) return; if (damageInfo.battleFieldGuid == battleField.guid) { DisplayHpInfo(); totalDamageDisplayer.SetDamage(damageInfo); } } private void OnCreateBattleField(string arg1, BattleField field) { if (field.GetType() == battleField.GetType()) { SetBattleField(field); } } protected override void OnClose() { base.OnClose(); if (battleRootNode != null) { battleRootNode.transform.SetParent(Launch.Instance.transform); battleRootNode.transform.localPosition = new Vector3(-10000, -10000, 0); } if (battleField != null) { battleField.OnRoundChange -= OnRoundChange; battleField = null; } } public void SetBattleField(BattleField _battleField) { if (battleField != null) { battleField.OnRoundChange -= OnRoundChange; battleField = null; } 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(); if (null == ui) { ui = UIManager.Instance.OpenWindow(); } ui.SetBattleField(battleField); battleField.UpdateCanvas(canvas); textSpeed.text = (BattleManager.Instance.speedIndex + 1).ToString(); Refresh(); battleField.OnRoundChange -= OnRoundChange; battleField.OnRoundChange += OnRoundChange; OnRoundChange(battleField.round, battleField.turnMax); } public override void Refresh() { base.Refresh(); DisplayHpInfo(); DisplayPlayerInfo(); totalDamageDisplayer.SetActive(false); skillTipsBlue.SetActive(false); skillTipsRed.SetActive(false); } private void OnCastSkill(string guid, SkillConfig skillConfig, TeamHero teamHero) { if (battleField == null) return; if (battleField.guid != guid) return; BattleObject battleObject = battleField.battleObjMgr.GetBattleObject(teamHero.ObjID); bool isRed = battleObject.Camp == BattleCamp.Red; SkillTips tips = isRed ? skillTipsRed : skillTipsBlue; tips.PlayMotion(battleField, isRed, teamHero, skillConfig); } private void DisplayHpInfo() { if (battleField == null) return; // 获取我方(红方)队伍数据 List myTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Red); // 获取敌方(蓝方)队伍数据 List enemyTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Blue); ulong myMaxHp = GetMaxHP(myTeam); ulong enemyMaxHp = GetMaxHP(enemyTeam); ulong myNowHp = GetNowHP(myTeam); ulong enemyNowHp = GetNowHP(enemyTeam); txtMyHp.text = Language.Get("BoneField09", UIHelper.ReplaceLargeArtNum(myNowHp), UIHelper.ReplaceLargeArtNum(myMaxHp)); txtEnemyHp.text = Language.Get("BoneField09", UIHelper.ReplaceLargeArtNum(enemyNowHp), UIHelper.ReplaceLargeArtNum(enemyMaxHp)); imgMyHp.fillAmount = Mathf.Clamp01((myMaxHp > 0) ? (float)myNowHp / myMaxHp : 0f); imgEnemyHp.fillAmount = Mathf.Clamp01((enemyMaxHp > 0) ? (float)enemyNowHp / enemyMaxHp : 0f); } private void DisplayPlayerInfo() { if (battleField == null) return; if (!ArenaManager.Instance.TryGetPlayerInfo(ArenaManager.Instance.atkPlayerId, out ArenaMatchInfo info)) return; // 获取我方(红方)队伍数据 List myTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Red); // 获取敌方(蓝方)队伍数据 List enemyTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Blue); txtEnemyLV.text = Language.Get("Arena22", info.Lv); txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName); txtEnemyFightPonit.text = UIHelper.ReplaceLargeArtNum(info.FightPower); enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)info.PlayerID, (int)info.Face, (int)info.FacePic)); var team = GetTeamHeroList(enemyTeam); enemyCountry.RefreshOnTeamCountry(team, true); txtMyLV.text = Language.Get("Arena22", PlayerDatas.Instance.baseData.LV); txtMyName.text = PlayerDatas.Instance.baseData.PlayerName; txtMyFightPonit.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower); myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID, PlayerDatas.Instance.baseData.face, PlayerDatas.Instance.baseData.facePic)); team = GetTeamHeroList(myTeam); myCountry.RefreshOnTeamCountry(team, true); for (int i = 0; i < myHeroHeads.Count; i++) { if (i < myTeam.Count) { myHeroHeads[i].SetActive(true); var teamHero = myTeam[i].teamHero; myHeroHeads[i].Display(teamHero.heroId, teamHero.SkinID, teamHero.level); } else { myHeroHeads[i].SetActive(false); } } // 敌方英雄显示(从右到左) for (int i = enemyHeroHeads.Count - 1; i >= 0; i--) { int teamIndex = enemyHeroHeads.Count - 1 - i; // 建立反向映射 if (teamIndex < enemyTeam.Count) { enemyHeroHeads[i].SetActive(true); var teamHero = enemyTeam[teamIndex].teamHero; // 使用映射后的索引 enemyHeroHeads[i].Display(teamHero.heroId, teamHero.SkinID, teamHero.level); } else { enemyHeroHeads[i].SetActive(false); } } } ulong GetMaxHP(List battleObjects) { ulong sun = 0; if (!battleObjects.IsNullOrEmpty()) { for (int i = 0; i < battleObjects.Count; i++) { sun += (ulong)battleObjects[i].teamHero.maxHp; } } return sun; } ulong GetNowHP(List battleObjects) { ulong sun = 0; if (!battleObjects.IsNullOrEmpty()) { for (int i = 0; i < battleObjects.Count; i++) { sun += (ulong)battleObjects[i].teamHero.curHp; } } return sun; } List GetTeamHeroList(List teams) { List teamHeroes = new List(); if (teams.IsNullOrEmpty()) return teamHeroes; foreach (var item in teams) { teamHeroes.Add(item.teamHero); } return teamHeroes; } private void OnRoundChange(int round, int maxRound) { txtWaveInfo.text = string.Format("{0}/{1}", round, maxRound); } bool IsOpenBattleChangeTab() { return FuncOpen.Instance.IsFuncOpen(ArenaManager.Instance.BattleChangeTabFuncId); } }