클라이언트에서 캠프 처치 없이도 ResourcePickup이 보이는 문제 수정
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -28,7 +28,74 @@ namespace Northbound
|
||||
public GameObject pickupEffectPrefab;
|
||||
public Transform effectSpawnPoint;
|
||||
|
||||
// 가시성 동기화 (기본적으로 숨김)
|
||||
private NetworkVariable<bool> _isVisible = new NetworkVariable<bool>(
|
||||
false,
|
||||
NetworkVariableReadPermission.Everyone,
|
||||
NetworkVariableWritePermission.Server
|
||||
);
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user