using UnityEngine;
|
using UnityEngine.UI;
|
|
/// <summary>
|
/// 战斗窗口基类
|
/// </summary>
|
public abstract class BaseBattleWin : UIBase
|
{
|
[Header("战斗场景挂载点")]
|
[SerializeField]
|
protected Transform mountPoint;
|
|
[Header("战斗控制按钮")]
|
[SerializeField] protected Button btnSpeed; // 速度控制
|
[SerializeField] protected Text textSpeed; // 速度显示
|
[SerializeField] protected Button btnPass; // 跳过战斗
|
[SerializeField] protected Button btnPause; // 暂停按钮 (BattleWin中的btnStop可对应此按钮)
|
|
[Header("战斗UI组件")]
|
[SerializeField] protected TotalDamageDisplayer totalDamageDisplayer; // 伤害统计
|
[SerializeField] protected SkillTips skillTipsRed; // 红方技能提示
|
[SerializeField] protected SkillTips skillTipsBlue; // 蓝方技能提示
|
[SerializeField] protected Text txtBattleRound; // 回合信息 (Arena的txtWaveInfo, Story/Bone的txtBattleRound)
|
protected BattleRootNode battleRootNode = null;
|
protected BattleField battleField; // 当前战斗的战场实例
|
|
protected override void InitComponent()
|
{
|
base.InitComponent();
|
// 绑定通用按钮事件
|
if (btnSpeed != null)
|
btnSpeed.AddListener(ChangeSpeed);
|
|
if (btnPass != null)
|
btnPass.AddListener(OnClickPass);
|
|
if (btnPause != null)
|
btnPause.AddListener(OnClickPause);
|
}
|
|
protected override void OnPreOpen()
|
{
|
base.OnPreOpen();
|
BattleManager.Instance.onBattleFieldCreate += OnCreateBattleField;
|
RegisterBattleEvents();
|
|
// 在打开时需要暂停主线战斗
|
if (BattleManager.Instance.storyBattleField != null)
|
BattleManager.Instance.storyBattleField.IsPause = true;
|
}
|
|
protected override void OnPreClose()
|
{
|
base.OnPreClose();
|
UIManager.Instance.CloseWindow<BattleHUDWin>();
|
BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField;
|
UnregisterBattleEvents();
|
|
// 在关闭时恢复主线战斗
|
if (BattleManager.Instance.storyBattleField != null)
|
BattleManager.Instance.storyBattleField.IsPause = false;
|
|
if (battleField != null)
|
{
|
battleField.OnRoundChange -= OnRoundChange;
|
}
|
}
|
|
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;
|
}
|
|
/// <summary>
|
/// 通用刷新逻辑 (模板方法)
|
/// </summary>
|
public override void Refresh()
|
{
|
base.Refresh();
|
|
// 1. 执行基类通用刷新逻辑 (清空旧状态)
|
if (totalDamageDisplayer != null)
|
totalDamageDisplayer.SetActive(false);
|
|
if (skillTipsBlue != null)
|
skillTipsBlue.SetActive(false);
|
|
if (skillTipsRed != null)
|
skillTipsRed.SetActive(false);
|
|
// 刷新速度显示
|
if (textSpeed != null && BattleManager.Instance != null)
|
textSpeed.text = (BattleManager.Instance.speedIndex + 1).ToString();
|
|
// 2. 调用子类特定的刷新逻辑
|
if (battleField != null) // 确保战场存在后再调用特定刷新
|
{
|
RefreshSpecific();
|
}
|
}
|
|
/// <summary>
|
/// 子类实现的特定刷新逻辑
|
/// </summary>
|
protected abstract void RefreshSpecific();
|
|
|
/// <summary>
|
/// 当战斗字段创建时 (子类必须重写, 以匹配特定的战场类型)
|
/// </summary>
|
/// <param name="guid"></param>
|
/// <param name="field"></param>
|
protected abstract void OnCreateBattleField(string guid, BattleField field);
|
// 示例:
|
// protected override void OnCreateBattleField(string guid, BattleField field)
|
// {
|
// // 检查是否是当前窗口关心的战场类型
|
// if (field is ArenaBattleField arenaField)
|
// {
|
// SetBattleField(arenaField); // 调用SetBattleField
|
// }
|
// }
|
|
/// <summary>
|
/// 设置战斗字段
|
/// </summary>
|
public virtual void SetBattleField(BattleField _battleField)
|
{
|
// 1. 清理旧的战场
|
if (battleField != null)
|
{
|
battleField.OnRoundChange -= OnRoundChange;
|
battleField = null;
|
}
|
|
// 2. 设置新的战场
|
battleField = _battleField;
|
if (battleField == null) return;
|
|
// 3. 关联战斗场景根节点
|
if (battleRootNode != null) // 归还旧的
|
{
|
battleRootNode.transform.localPosition = Vector3.zero;
|
battleRootNode.transform.SetParent(Launch.Instance.transform);
|
}
|
|
battleRootNode = battleField.battleRootNode;
|
if (battleRootNode == null) return;
|
|
battleRootNode.transform.SetParent(mountPoint); // 挂载新的
|
battleRootNode.transform.localPosition = Vector3.zero;
|
battleRootNode.transform.localScale = Vector3.one;
|
|
// 4. 打开或获取HUD
|
BattleHUDWin ui = UIManager.Instance.GetUI<BattleHUDWin>();
|
if (null == ui)
|
{
|
ui = UIManager.Instance.OpenWindow<BattleHUDWin>();
|
}
|
ui.SetBattleField(battleField);
|
|
// 5. 更新Canvas
|
battleField.UpdateCanvas(canvas);
|
|
// 6. 刷新UI
|
Refresh();
|
|
// 7. 监听回合变更
|
battleField.OnRoundChange -= OnRoundChange;
|
battleField.OnRoundChange += OnRoundChange;
|
OnRoundChange(battleField.round, battleField.turnMax); // 立即执行一次以显示初始回合
|
}
|
|
|
/// <summary>
|
/// 暂停/继续
|
/// </summary>
|
protected virtual void OnClickPause()
|
{
|
if (null == battleField)
|
return;
|
battleField.IsPause = !battleField.IsPause;
|
}
|
|
/// <summary>
|
/// 跳过战斗
|
/// </summary>
|
protected virtual void OnClickPass()
|
{
|
if (null == battleField)
|
return;
|
battleField.ForceFinish();
|
}
|
|
/// <summary>
|
/// 改变速度
|
/// </summary>
|
protected virtual 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]);
|
|
if (textSpeed != null)
|
textSpeed.text = (BattleManager.Instance.speedIndex + 1).ToString();
|
}
|
|
|
/// <summary>
|
/// 注册战斗事件
|
/// </summary>
|
protected virtual void RegisterBattleEvents()
|
{
|
EventBroadcast.Instance.AddListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
|
EventBroadcast.Instance.AddListener<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, OnCastSkill);
|
}
|
|
/// <summary>
|
/// 注销战斗事件
|
/// (BattleWin 应该重写此方法并置空)
|
/// </summary>
|
protected virtual void UnregisterBattleEvents()
|
{
|
EventBroadcast.Instance.RemoveListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
|
EventBroadcast.Instance.RemoveListener<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, OnCastSkill);
|
}
|
|
/// <summary>
|
/// 造成伤害
|
/// </summary>
|
protected virtual void OnDamageTaken(BattleDmgInfo damageInfo)
|
{
|
if (battleField == null || damageInfo.battleFieldGuid != battleField.guid)
|
return;
|
|
// 通用逻辑:显示伤害数字
|
if (totalDamageDisplayer != null)
|
totalDamageDisplayer.SetDamage(damageInfo);
|
}
|
|
/// <summary>
|
/// 释放技能 (通用:显示技能Tips)
|
/// </summary>
|
protected virtual void OnCastSkill(string guid, SkillConfig skillConfig, TeamHero teamHero)
|
{
|
if (battleField == null || battleField.guid != guid)
|
return;
|
|
BattleObject battleObject = battleField.battleObjMgr.GetBattleObject(teamHero.ObjID);
|
if (battleObject == null)
|
return;
|
|
bool isRed = battleObject.Camp == BattleCamp.Red;
|
SkillTips tips = isRed ? skillTipsRed : skillTipsBlue;
|
|
if (tips != null)
|
tips.PlayMotion(battleField, isRed, teamHero, skillConfig);
|
}
|
|
/// <summary>
|
/// 回合变更 (通用:刷新回合显示)
|
/// </summary>
|
protected virtual void OnRoundChange(int round, int maxRound)
|
{
|
if (txtBattleRound != null)
|
{
|
txtBattleRound.text = string.Format("{0}/{1}", round, maxRound);
|
}
|
}
|
|
}
|