네트워크 멀티플레이 환경 문제 수정

관련 문제가 다시 발생하면 이 커밋으로 돌아올 것
This commit is contained in:
2026-02-02 04:24:14 +09:00
parent 3e747a9d97
commit 10b496dfae
49 changed files with 2860 additions and 1792 deletions

View File

@@ -32,24 +32,14 @@ namespace Northbound
public bool CanInteract(ulong playerId)
{
// 이미 수집됨
if (_isCollected)
return false;
// 플레이어 인벤토리 확인
if (NetworkManager.Singleton != null &&
NetworkManager.Singleton.ConnectedClients.TryGetValue(playerId, out var client))
var resourceManager = ServerResourceManager.Instance;
if (resourceManager != null)
{
if (client.PlayerObject != null)
{
var playerInventory = client.PlayerObject.GetComponent<PlayerResourceInventory>();
if (playerInventory != null)
{
// 플레이어가 받을 수 있는 공간이 없으면 상호작용 불가
if (playerInventory.GetAvailableSpace() <= 0)
return false;
}
}
if (resourceManager.GetAvailableSpace(playerId) <= 0)
return false;
}
return true;
@@ -69,49 +59,52 @@ namespace Northbound
if (!CanInteract(playerId))
return;
// 중복 수집 방지
if (_isCollected)
return;
_isCollected = true;
// 플레이어의 인벤토리 확인
var playerObject = NetworkManager.Singleton.ConnectedClients[playerId].PlayerObject;
if (playerObject == null)
return;
var playerInventory = playerObject.GetComponent<PlayerResourceInventory>();
if (playerInventory == null)
var resourceManager = ServerResourceManager.Instance;
if (resourceManager == null)
{
Debug.LogWarning($"플레이어 {playerId}에게 PlayerResourceInventory 컴포넌트가 없습니다.");
Debug.LogWarning("ServerResourceManager 인스턴스를 찾을 수 없습니다.");
_isCollected = false;
return;
}
// 플레이어가 받을 수 있는 최대량 계산
int playerAvailableSpace = playerInventory.GetAvailableSpace();
// 실제 지급할 양 계산
int playerAvailableSpace = resourceManager.GetAvailableSpace(playerId);
int collectedAmount = Mathf.Min(resourceAmount, playerAvailableSpace);
if (collectedAmount <= 0)
{
Debug.Log($"플레이어 {playerId}의 인벤토리가 가득 찼습니다.");
_isCollected = false; // 수집 실패 시 다시 시도 가능하도록
_isCollected = false;
return;
}
// 플레이어에게 자원 추가
playerInventory.AddResourceServerRpc(collectedAmount);
resourceManager.AddResource(playerId, collectedAmount);
UpdatePlayerResourcesClientRpc(playerId);
Debug.Log($"플레이어 {playerId}가 {collectedAmount} {resourceName}을(를) 획득했습니다.");
// 이펙트 표시 및 오브젝트 제거
ShowPickupEffectClientRpc();
// 짧은 딜레이 후 제거 (이펙트를 위해)
Invoke(nameof(DestroyPickup), 0.1f);
}
[Rpc(SendTo.ClientsAndHost)]
private void UpdatePlayerResourcesClientRpc(ulong playerId)
{
var playerObject = NetworkManager.Singleton.ConnectedClients[playerId].PlayerObject;
if (playerObject != null)
{
var playerInventory = playerObject.GetComponent<PlayerResourceInventory>();
if (playerInventory != null)
{
playerInventory.RequestResourceUpdateServerRpc();
}
}
}
[Rpc(SendTo.ClientsAndHost)]
private void ShowPickupEffectClientRpc()
{