using UnityEngine; using Unity.Netcode; using Colosseum.Stats; namespace Colosseum.Player { /// /// 플레이어 네트워크 상태 관리 (HP, MP 등) /// public class PlayerNetworkController : NetworkBehaviour { [Header("References")] [Tooltip("CharacterStats 컴포넌트 (없으면 자동 검색)")] [SerializeField] private CharacterStats characterStats; // 네트워크 동기화 변수 private NetworkVariable currentHealth = new NetworkVariable(100f); private NetworkVariable currentMana = new NetworkVariable(50f); public float Health => currentHealth.Value; public float Mana => currentMana.Value; public float MaxHealth => characterStats != null ? characterStats.MaxHealth : 100f; public float MaxMana => characterStats != null ? characterStats.MaxMana : 50f; public CharacterStats Stats => characterStats; public override void OnNetworkSpawn() { // CharacterStats 참조 확인 if (characterStats == null) { characterStats = GetComponent(); } // 초기화 if (IsServer) { currentHealth.Value = MaxHealth; currentMana.Value = MaxMana; } } /// /// 대미지 적용 (서버에서만 실행) /// [Rpc(SendTo.Server)] public void TakeDamageRpc(float damage) { currentHealth.Value = Mathf.Max(0f, currentHealth.Value - damage); if (currentHealth.Value <= 0f) { HandleDeath(); } } /// /// 마나 소모 (서버에서만 실행) /// [Rpc(SendTo.Server)] public void UseManaRpc(float amount) { currentMana.Value = Mathf.Max(0f, currentMana.Value - amount); } /// /// 체력 회복 (서버에서만 실행) /// [Rpc(SendTo.Server)] public void RestoreHealthRpc(float amount) { currentHealth.Value = Mathf.Min(MaxHealth, currentHealth.Value + amount); } /// /// 마나 회복 (서버에서만 실행) /// [Rpc(SendTo.Server)] public void RestoreManaRpc(float amount) { currentMana.Value = Mathf.Min(MaxMana, currentMana.Value + amount); } private void HandleDeath() { // TODO: 사망 처리 로직 Debug.Log($"Player {OwnerClientId} died!"); } } }