using System; using System.Collections.Generic; using LitJson; using UnityEngine; using UnityEngine.UI; public class TianziBillboradBattleWin : BaseBattleWin { [SerializeField] Transform transButtons; [SerializeField] public TianziDamageBar tianziDamageBar; [SerializeField] public SkillWordCell[] skillWordCells; [SerializeField] public BossHeadCell bossHeadCell; [SerializeField] public Text txtBossName; [SerializeField] HeroCountryComponent myCountry; [SerializeField] HeroCountryComponent enemyCountry; private BattleObject bossBattleObject = null; [SerializeField] public List buffCells; [SerializeField] RectTransform rectBoxEnd; [SerializeField] UIEffectPlayer uiEffectPlayer; protected override void OnPreOpen() { base.OnPreOpen(); tianziDamageBar.StageUp += OnStageUp; tianziDamageBar.ValueChangeAction += OnValueChangeAction; tianziDamageBar.ChangeEndAction += OnChangeEndAction; TianziBillboradManager.Instance.OnUpdateBarInfoEvent += OnUpdateBarInfoEvent; TianziBillboradManager.Instance.PlayUiEffectAction += OnPlayUiEffectAction; MainWin.TabChangeEvent += OnTabChangeEvent; bool isOpenBattleChangeTab = IsOpenBattleChangeTab(); transButtons.localPosition = new Vector3(0, isOpenBattleChangeTab ? 130 : 0, 0); if (isOpenBattleChangeTab) { UIManager.Instance.GetUI()?.CloseSubUI(); } else { UIManager.Instance.CloseWindow(); } } private void OnPlayUiEffectAction() { uiEffectPlayer.Play(); } protected override void OnPreClose() { base.OnPreClose(); tianziDamageBar.StageUp -= OnStageUp; tianziDamageBar.ValueChangeAction -= OnValueChangeAction; tianziDamageBar.ChangeEndAction -= OnChangeEndAction; TianziBillboradManager.Instance.OnUpdateBarInfoEvent -= OnUpdateBarInfoEvent; TianziBillboradManager.Instance.PlayUiEffectAction -= OnPlayUiEffectAction; MainWin.TabChangeEvent -= OnTabChangeEvent; bool isOpenBattleChangeTab = IsOpenBattleChangeTab(); if (isOpenBattleChangeTab) { UIManager.Instance.GetUI()?.RestoreSubUI(); } else { UIManager.Instance.OpenWindow(); } if (bossBattleObject != null) { if (bossBattleObject.buffMgr != null) { bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; } bossBattleObject = null; } } private void OnUpdateBarInfoEvent(ulong loaclNowHunt, ulong loaclMaxHp, int loaclHpNum) { tianziDamageBar.Show(loaclNowHunt, loaclMaxHp, loaclHpNum); } private void OnStageUp(int stage) { GameObject hero = bossBattleObject.heroGo; if (hero == null || stage <= 1) return; GameObject prefab = UIUtility.CreateWidget("TianziBillboradBox", "TianziBillboradBox"); prefab.transform.SetParentEx(hero.transform, Vector3.zero, Quaternion.identity, Vector3.one); TianziBillboradBox boxAnimator = prefab.GetComponent(); if (boxAnimator != null) { Vector3 startPos = hero.transform.position; Vector3 endPos = rectBoxEnd.position; boxAnimator.StartAnimation(startPos, endPos); } else { Destroy(prefab); } } private void OnTabChangeEvent() { CloseWindow(); } protected override void OnCreateBattleField(string guid, BattleField field) { if (field is TianziBillboradBattleField) { SetBattleField(field); } } protected override void RefreshSpecific() { DestroyExistingTianziBillboradBoxes(); TianziBillboradBattleField boneField = battleField as TianziBillboradBattleField; if (boneField == null) return; NPCLineupConfig lineupConfig = boneField.GetBossLineupConfig(); if (bossBattleObject != null) { if (bossBattleObject.buffMgr != null) { bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; } bossBattleObject = null; } bossBattleObject = boneField.FindBoss(); DisplaySkillWordsList(lineupConfig); tianziDamageBar.Init(); if (null != bossBattleObject) { TeamHero teamHero = bossBattleObject.teamHero; bossHeadCell.SetTeamHero(teamHero); txtBossName.text = teamHero.name; NPCConfig npcConfig = NPCConfig.Get(teamHero.NPCID); bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged; bossBattleObject.buffMgr.onBuffChanged += OnBuffChanged; } else { bossHeadCell.SetTeamHero(null); txtBossName.text = string.Empty; Debug.LogError("找不到boss"); } OnRoundChange(battleField.round, battleField.turnMax); // 确保回合显示被调用 OnBuffChanged(); // 获取我方(红方)队伍数据 List myTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Red); // 获取敌方(蓝方)队伍数据 List enemyTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Blue); myCountry.RefreshOnTeamCountry(GetTeamHeroList(myTeam), true); enemyCountry.RefreshOnTeamCountry(GetTeamHeroList(enemyTeam), true); } private void DestroyExistingTianziBillboradBoxes() { // 查找场景中所有存在的TianziBillboradBox实例 TianziBillboradBox[] existingBoxes = FindObjectsOfType(); foreach (TianziBillboradBox box in existingBoxes) { if (box != null && box.gameObject != null) { Destroy(box.gameObject); } } } private void OnBuffChanged() { var buffList = new List(); if (null != bossBattleObject) { buffList = bossBattleObject.buffMgr.GetBuffList(); } RefreshBuff(buffList); } private void OnValueChangeAction(float nowValue, int CurrentStage) { if (bossBattleObject == null || bossBattleObject.heroInfoBar == null) return; bossBattleObject.heroInfoBar.UpdateHP(nowValue); //Debug.Log($"TianziDamageBar nowValue {nowValue} 时间: {DateTime.Now:HH:mm:ss}"); } private void OnChangeEndAction(ulong nowHunt, ulong nowHpMax) { if (bossBattleObject == null || bossBattleObject.heroInfoBar == null) return; if (nowHpMax > 0) { float percentage = Mathf.Clamp(nowHunt, 0, nowHpMax) / (float)nowHpMax; bossBattleObject.heroInfoBar.UpdateHP(percentage); //Debug.Log($"TianziDamageBar nowValue {percentage} 时间: {DateTime.Now:HH:mm:ss}"); } } public void DisplaySkillWordsList(NPCLineupConfig lineUPConfig) { if (skillWordCells.IsNullOrEmpty()) return; if (null == lineUPConfig) return; for (int i = 0; i < skillWordCells.Length; i++) { if (i < lineUPConfig.SkillIDExList.Length) { skillWordCells[i].SetActive(true); int skillID = lineUPConfig.SkillIDExList[i]; skillWordCells[i].Init(skillID, () => { SmallTipWin.showText = Language.Get("SmallTipFomat", SkillConfig.Get(skillID)?.SkillName, SkillConfig.Get(skillID)?.Description); SmallTipWin.worldPos = CameraManager.uiCamera.ScreenToWorldPoint(Input.mousePosition); SmallTipWin.isDownShow = true; UIManager.Instance.OpenWindow(); }); } else { skillWordCells[i].SetActive(false); } } } public void RefreshBuff(List datas) { if (buffCells.IsNullOrEmpty()) return; for (int i = 0; i < buffCells.Count; i++) { if (i < datas.Count) { buffCells[i].SetActive(true); HB428_tagSCBuffRefresh buffData = datas[i]; buffCells[i].Init(buffData, () => { // 点击buff图标 显示buff描述/当前身上所有buff }); } else { buffCells[i].SetActive(false); } } } bool IsOpenBattleChangeTab() { return FuncOpen.Instance.IsFuncOpen(ArenaManager.Instance.BattleChangeTabFuncId); } List GetTeamHeroList(List teams) { List teamHeroes = new List(); if (teams.IsNullOrEmpty()) return teamHeroes; foreach (var item in teams) { teamHeroes.Add(item.teamHero); } return teamHeroes; } }