using System; using UnityEngine; using Colosseum.Player; namespace Colosseum.UI { /// /// 플레이어 HUD - 체력/마나 바 관리 /// public class PlayerHUD : MonoBehaviour { [Header("Stat Bars")] [SerializeField] private StatBar healthBar; [SerializeField] private StatBar manaBar; [Header("Target")] [Tooltip("자동으로 로컬 플레이어 찾기")] [SerializeField] private bool autoFindPlayer = true; private PlayerNetworkController targetPlayer; private void Start() { if (autoFindPlayer) { FindLocalPlayer(); } } private void Update() { // 플레이어가 아직 없으면 계속 찾기 if (targetPlayer == null && autoFindPlayer) { FindLocalPlayer(); } } private void OnDestroy() { // 이벤트 구독 해제 UnsubscribeFromEvents(); } private void FindLocalPlayer() { foreach (var player in FindObjectsByType(FindObjectsSortMode.None)) { if (player.IsOwner) { SetTarget(player); break; } } } /// /// 추적할 플레이어 설정 /// public void SetTarget(PlayerNetworkController player) { // 이전 타겟 구독 해제 UnsubscribeFromEvents(); targetPlayer = player; // 새 타겟 구독 SubscribeToEvents(); // 초기 값 설정 UpdateStatBars(); } private void SubscribeToEvents() { if (targetPlayer == null) return; targetPlayer.OnHealthChanged += HandleHealthChanged; targetPlayer.OnManaChanged += HandleManaChanged; targetPlayer.OnShieldChanged += HandleShieldChanged; } private void UnsubscribeFromEvents() { if (targetPlayer == null) return; targetPlayer.OnHealthChanged -= HandleHealthChanged; targetPlayer.OnManaChanged -= HandleManaChanged; targetPlayer.OnShieldChanged -= HandleShieldChanged; } private void HandleHealthChanged(float oldValue, float newValue) { if (healthBar != null && targetPlayer != null) { healthBar.SetValue(newValue, targetPlayer.MaxHealth, targetPlayer.Shield); } } private void HandleManaChanged(float oldValue, float newValue) { if (manaBar != null && targetPlayer != null) { manaBar.SetValue(newValue, targetPlayer.MaxMana); } } private void HandleShieldChanged(float oldValue, float newValue) { if (healthBar != null && targetPlayer != null) { healthBar.SetValue(targetPlayer.Health, targetPlayer.MaxHealth, newValue); } } private void UpdateStatBars() { if (targetPlayer == null) return; if (healthBar != null) { healthBar.SetValue(targetPlayer.Health, targetPlayer.MaxHealth, targetPlayer.Shield); } if (manaBar != null) { manaBar.SetValue(targetPlayer.Mana, targetPlayer.MaxMana); } } } }