클라이언트에서 캠프 처치 없이도 ResourcePickup이 보이는 문제 수정

This commit is contained in:
2026-02-25 23:52:13 +09:00
parent 72fe5e5b04
commit a4eae438de
2 changed files with 71 additions and 21 deletions

View File

@@ -203,8 +203,8 @@ namespace Northbound
networkObj.SpawnWithOwnership(NetworkManager.Singleton.LocalClientId); networkObj.SpawnWithOwnership(NetworkManager.Singleton.LocalClientId);
// 비활성화는 ServerRpc를 통해 처리 // NetworkVariable을 통해 가시성 동기화 (기본적으로 숨김)
DisablePickupClientRpc(); _resourcePickup.SetVisible(false);
} }
private void HandleCreepDeath(EnemyUnit deadCreep) private void HandleCreepDeath(EnemyUnit deadCreep)
@@ -225,7 +225,8 @@ namespace Northbound
// 모든 creep이 처치되었으면 ResourcePickup 활성화 // 모든 creep이 처치되었으면 ResourcePickup 활성화
if (_spawnedCreeps.Count == 0 && _resourcePickup != null) 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) private CreepData GetCreepDataFromPrefab(GameObject prefab)
{ {
if (prefab == null) return null; if (prefab == null) return null;

View File

@@ -28,7 +28,74 @@ namespace Northbound
public GameObject pickupEffectPrefab; public GameObject pickupEffectPrefab;
public Transform effectSpawnPoint; public Transform effectSpawnPoint;
// 가시성 동기화 (기본적으로 숨김)
private NetworkVariable<bool> _isVisible = new NetworkVariable<bool>(
false,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Server
);
private bool _isCollected = false; private bool _isCollected = false;
private Renderer[] _renderers;
private Collider[] _colliders;
public override void OnNetworkSpawn()
{
base.OnNetworkSpawn();
// 렌더러와 콜라이더 캐시
_renderers = GetComponentsInChildren<Renderer>();
_colliders = GetComponentsInChildren<Collider>();
// 초기 가시성 적용
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;
}
}
}
/// <summary>
/// 가시성 설정 (서버만 호출 가능)
/// </summary>
public void SetVisible(bool visible)
{
if (IsServer)
{
_isVisible.Value = visible;
}
}
public bool CanInteract(ulong playerId) public bool CanInteract(ulong playerId)
{ {