diff --git a/Assets/Scripts/CreepCamp.cs b/Assets/Scripts/CreepCamp.cs index 28180b3..2c89325 100644 --- a/Assets/Scripts/CreepCamp.cs +++ b/Assets/Scripts/CreepCamp.cs @@ -203,8 +203,8 @@ namespace Northbound networkObj.SpawnWithOwnership(NetworkManager.Singleton.LocalClientId); - // 비활성화는 ServerRpc를 통해 처리 - DisablePickupClientRpc(); + // NetworkVariable을 통해 가시성 동기화 (기본적으로 숨김) + _resourcePickup.SetVisible(false); } private void HandleCreepDeath(EnemyUnit deadCreep) @@ -225,7 +225,8 @@ namespace Northbound // 모든 creep이 처치되었으면 ResourcePickup 활성화 if (_spawnedCreeps.Count == 0 && _resourcePickup != null) { - EnableResourcePickupClientRpc(); + // NetworkVariable이 자동으로 클라이언트에 동기화됨 + _resourcePickup.SetVisible(true); } } @@ -262,24 +263,6 @@ namespace Northbound } } - [Rpc(SendTo.ClientsAndHost)] - private void EnableResourcePickupClientRpc() - { - if (_resourcePickup != null) - { - _resourcePickup.gameObject.SetActive(true); - } - } - - [Rpc(SendTo.ClientsAndHost)] - private void DisablePickupClientRpc() - { - if (_resourcePickup != null) - { - _resourcePickup.gameObject.SetActive(false); - } - } - private CreepData GetCreepDataFromPrefab(GameObject prefab) { if (prefab == null) return null; diff --git a/Assets/Scripts/ResourcePickup.cs b/Assets/Scripts/ResourcePickup.cs index 91f907c..545f6c6 100644 --- a/Assets/Scripts/ResourcePickup.cs +++ b/Assets/Scripts/ResourcePickup.cs @@ -28,7 +28,74 @@ namespace Northbound public GameObject pickupEffectPrefab; public Transform effectSpawnPoint; + // 가시성 동기화 (기본적으로 숨김) + private NetworkVariable _isVisible = new NetworkVariable( + false, + NetworkVariableReadPermission.Everyone, + NetworkVariableWritePermission.Server + ); + private bool _isCollected = false; + private Renderer[] _renderers; + private Collider[] _colliders; + + public override void OnNetworkSpawn() + { + base.OnNetworkSpawn(); + + // 렌더러와 콜라이더 캐시 + _renderers = GetComponentsInChildren(); + _colliders = GetComponentsInChildren(); + + // 초기 가시성 적용 + UpdateVisibility(_isVisible.Value); + + // 가시성 변경 이벤트 구독 + _isVisible.OnValueChanged += OnVisibilityChanged; + } + + public override void OnNetworkDespawn() + { + _isVisible.OnValueChanged -= OnVisibilityChanged; + base.OnNetworkDespawn(); + } + + private void OnVisibilityChanged(bool previousValue, bool newValue) + { + UpdateVisibility(newValue); + } + + private void UpdateVisibility(bool visible) + { + if (_renderers != null) + { + foreach (var renderer in _renderers) + { + if (renderer != null) + renderer.enabled = visible; + } + } + + if (_colliders != null) + { + foreach (var collider in _colliders) + { + if (collider != null) + collider.enabled = visible; + } + } + } + + /// + /// 가시성 설정 (서버만 호출 가능) + /// + public void SetVisible(bool visible) + { + if (IsServer) + { + _isVisible.Value = visible; + } + } public bool CanInteract(ulong playerId) {