체력바 추가

플레이어는 상시 표시, 나머지는 체력 변경 시 표시
This commit is contained in:
2026-02-25 15:15:29 +09:00
parent f3923079a4
commit 17b3cf6746
22 changed files with 369 additions and 147 deletions

View File

@@ -6,7 +6,7 @@ using UnityEngine.InputSystem;
using Unity.Cinemachine;
using Northbound;
public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageable
public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageable, IHealthProvider
{
[Header("Movement Settings")]
public float rotationSpeed = 10f;
@@ -22,6 +22,10 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
[SerializeField] private GameObject resourcePickupPrefab; // 자원 드랍 프리팹
[SerializeField] private float respawnDelay = 10f; // 부활 대기 시간 (초)
[Header("Health Bar")]
[SerializeField] private bool showHealthBar = true;
[SerializeField] private GameObject healthBarPrefab;
// 이 플레이어를 제어하는 클라이언트 ID (서버 소유권이지만 논리적 소유자)
private NetworkVariable<ulong> _ownerPlayerId = new NetworkVariable<ulong>(
ulong.MaxValue,
@@ -47,6 +51,7 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
private Animator _animator;
private NetworkAnimator _networkAnimator;
private PlayerStats _playerStats;
private UnitHealthBar _healthBar;
// 이 플레이어가 로컬 플레이어인지 확인
@@ -88,6 +93,12 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
_currentHealth.OnValueChanged += OnHealthChanged;
_ownerPlayerId.OnValueChanged += OnOwnerPlayerIdChanged;
// 체력바 생성
if (showHealthBar && healthBarPrefab != null)
{
CreateHealthBar();
}
// 이미 로컬 플레이어로 설정되어 있으면 입력 초기화
TryInitializeLocalPlayer();
}
@@ -443,6 +454,12 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
private void OnHealthChanged(int previousValue, int newValue)
{
// 체력바 업데이트
if (_healthBar != null)
{
_healthBar.UpdateHealth();
}
if (IsLocalPlayer)
{
// UI 업데이트 등
@@ -451,6 +468,29 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
#endregion
#region Health Bar
private void CreateHealthBar()
{
if (_healthBar != null)
return;
if (healthBarPrefab == null)
return;
GameObject healthBarObj = Instantiate(healthBarPrefab, transform);
_healthBar = healthBarObj.GetComponent<UnitHealthBar>();
if (_healthBar != null)
{
// 플레이어 체력바는 상시 표시
_healthBar.hideWhenFull = false;
_healthBar.Initialize(this);
}
}
#endregion
#region Gizmos
private void OnDrawGizmosSelected()