Files
WarGame/Assets/Scripts/UI/BattleHUD.cs

137 lines
5.0 KiB
C#
Raw Permalink Normal View History

2026-09-30 23:45:58 +01:00
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using WarGame.Managers;
namespace WarGame.UI
{
public class BattleHUD : MonoBehaviour
{
[Header("Ongoing Unit Count Display")]
[SerializeField] private TMP_Text playerUnitsCountText;
[SerializeField] private TMP_Text enemyUnitsCountText;
[Header("Round & State Display")]
[SerializeField] private TMP_Text waveTitleText;
[SerializeField] private TMP_Text battleStatusText;
[Header("Controls")]
[SerializeField] private Button startBattleButton;
[SerializeField] private Button speed1xButton;
[SerializeField] private Button speed2xButton;
[SerializeField] private Button speed4xButton;
private void Start()
{
if (BattleManager.Instance != null)
{
BattleManager.Instance.OnUnitCountsChanged += UpdateOngoingUnitCounts;
BattleManager.Instance.OnBattleStateChanged += HandleBattleStateChanged;
BattleManager.Instance.OnWaveChanged += UpdateWaveDisplay;
UpdateWaveDisplay(BattleManager.Instance.CurrentWave);
UpdateOngoingUnitCounts(BattleManager.Instance.PlayerAliveCount, BattleManager.Instance.EnemyAliveCount);
HandleBattleStateChanged(BattleManager.Instance.CurrentBattleState);
}
if (startBattleButton != null)
{
startBattleButton.onClick.AddListener(OnStartBattleClicked);
}
if (speed1xButton != null) speed1xButton.onClick.AddListener(() => SetGameSpeed(1f));
if (speed2xButton != null) speed2xButton.onClick.AddListener(() => SetGameSpeed(2f));
if (speed4xButton != null) speed4xButton.onClick.AddListener(() => SetGameSpeed(4f));
}
private void OnDestroy()
{
if (BattleManager.Instance != null)
{
BattleManager.Instance.OnUnitCountsChanged -= UpdateOngoingUnitCounts;
BattleManager.Instance.OnBattleStateChanged -= HandleBattleStateChanged;
BattleManager.Instance.OnWaveChanged -= UpdateWaveDisplay;
}
}
private void UpdateOngoingUnitCounts(int playerAlive, int enemyAlive)
{
if (playerUnitsCountText != null)
{
int totalPlayer = BattleManager.Instance != null ? BattleManager.Instance.PlayerTotalCount : playerAlive;
playerUnitsCountText.text = $"Player Army: {playerAlive} / {totalPlayer}";
}
if (enemyUnitsCountText != null)
{
int totalEnemy = BattleManager.Instance != null ? BattleManager.Instance.EnemyTotalCount : enemyAlive;
enemyUnitsCountText.text = $"Enemy Force: {enemyAlive} / {totalEnemy}";
}
UpdateStartButtonState();
}
private void UpdateWaveDisplay(int wave)
{
if (waveTitleText != null)
{
waveTitleText.text = $"Battle Round: {wave}";
}
}
private void HandleBattleStateChanged(BattleState state)
{
if (battleStatusText != null)
{
switch (state)
{
case BattleState.Preparation:
battleStatusText.text = "PHASE: RECRUITMENT & PREPARATION";
battleStatusText.color = new Color(0.3f, 0.8f, 1f);
break;
case BattleState.BattleInProgress:
battleStatusText.text = "PHASE: BATTLE IN PROGRESS";
battleStatusText.color = new Color(1f, 0.4f, 0.2f);
break;
case BattleState.Victory:
battleStatusText.text = "VICTORY ACHIEVED!";
battleStatusText.color = new Color(0.3f, 1f, 0.4f);
break;
case BattleState.Defeat:
battleStatusText.text = "DEFEAT!";
battleStatusText.color = new Color(1f, 0.2f, 0.2f);
break;
}
}
UpdateStartButtonState();
}
private void UpdateStartButtonState()
{
if (startBattleButton == null || BattleManager.Instance == null) return;
bool isPrep = BattleManager.Instance.CurrentBattleState == BattleState.Preparation;
bool hasUnits = BattleManager.Instance.PlayerTotalCount > 0;
startBattleButton.interactable = isPrep && hasUnits;
}
private void OnStartBattleClicked()
{
if (BattleManager.Instance != null)
{
BattleManager.Instance.StartBattle();
}
}
private void SetGameSpeed(float speed)
{
if (BattleManager.Instance != null)
{
BattleManager.Instance.SetGameSpeed(speed);
}
}
}
}