using System.Collections.Generic;
|
using LitJson;
|
using UnityEngine;
|
using UnityEngine.UI;
|
|
public class ArenaBattleWin : UIBase
|
{
|
// 组件引用
|
[SerializeField] Transform mountPoint;
|
[SerializeField] Button btnSpeed;
|
[SerializeField] Text textSpeed;
|
[SerializeField] Button btnPass;
|
[SerializeField] Button btnPause;
|
[SerializeField] RendererAdjuster buttonsAdjuster;
|
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<ArenaHeroHead> myHeroHeads;
|
|
[SerializeField] HeroCountryComponent enemyCountry;
|
[SerializeField] TextEx txtEnemyLV;
|
[SerializeField] TextEx txtEnemyName;
|
[SerializeField] TextEx txtEnemyHp;
|
[SerializeField] ImageEx imgEnemyHp;
|
[SerializeField] TextEx txtEnemyFightPonit;
|
[SerializeField] AvatarCell enemyAvatarCell;
|
[SerializeField] List<ArenaHeroHead> enemyHeroHeads;
|
|
[SerializeField] TextEx txtWaveInfo;
|
// 生命周期
|
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();
|
// SetBattleField(BattleManager.Instance.storyBattleField);
|
BattleManager.Instance.onBattleFieldCreate += OnCreateBattleField;
|
EventBroadcast.Instance.AddListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
|
EventBroadcast.Instance.AddListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd);
|
//UIManager.Instance.CloseWindow<MainWin>();
|
}
|
|
protected override void OnPreClose()
|
{
|
base.OnPreClose();
|
UIManager.Instance.CloseWindow<BattleHUDWin>();
|
BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField;
|
EventBroadcast.Instance.RemoveListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
|
EventBroadcast.Instance.RemoveListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd);
|
//UIManager.Instance.OpenWindow<MainWin>(0);
|
}
|
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();
|
}
|
}
|
|
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);
|
buttonsAdjuster.SetSortingOrder(BattleConst.ActiveHeroActionSortingOrder);
|
textSpeed.text = (BattleManager.Instance.speedIndex + 1).ToString();
|
DisplayHpInfo();
|
DisplayPlayerInfo();
|
}
|
private void DisplayHpInfo()
|
{
|
if (battleField == null)
|
return;
|
|
// 获取我方(红方)队伍数据
|
List<BattleObject> myTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Red);
|
// 获取敌方(蓝方)队伍数据
|
List<BattleObject> 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<BattleObject> myTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Red);
|
// 获取敌方(蓝方)队伍数据
|
List<BattleObject> 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));
|
myCountry.RefreshOnTeamCountry(TeamType.Arena);
|
|
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<BattleObject> 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<BattleObject> battleObjects)
|
{
|
ulong sun = 0;
|
if (!battleObjects.IsNullOrEmpty())
|
{
|
for (int i = 0; i < battleObjects.Count; i++)
|
{
|
sun += (ulong)battleObjects[i].teamHero.curHp;
|
}
|
}
|
return sun;
|
}
|
|
List<TeamHero> GetTeamHeroList(List<BattleObject> teams)
|
{
|
List<TeamHero> teamHeroes = new List<TeamHero>();
|
if (teams.IsNullOrEmpty())
|
return teamHeroes;
|
foreach (var item in teams)
|
{
|
teamHeroes.Add(item.teamHero);
|
}
|
return teamHeroes;
|
|
}
|
}
|