모든 네트워크 오브젝트의 소유권을 서버가 갖도록 함

Distributable -> None
관련 사이드 이펙트로 인한 버그 수정
This commit is contained in:
2026-02-18 02:18:42 +09:00
parent da8c87d082
commit 4ffbbb0aff
10 changed files with 388 additions and 129 deletions

View File

@@ -194,15 +194,16 @@ namespace Northbound
return false;
// 플레이어가 자원을 가지고 있는지 확인
if (NetworkManager.Singleton != null &&
NetworkManager.Singleton.ConnectedClients.TryGetValue(playerId, out var client))
// NetworkPlayerController로 찾기 (서버 소유권으로 스폰한 경우 PlayerObject가 null일 수 있음)
var spawnedObjects = NetworkManager.Singleton.SpawnManager.SpawnedObjects;
foreach (var kvp in spawnedObjects)
{
if (client.PlayerObject != null)
var controller = kvp.Value.GetComponent<NetworkPlayerController>();
if (controller != null && controller.OwnerPlayerId == playerId)
{
var playerInventory = client.PlayerObject.GetComponent<PlayerResourceInventory>();
var playerInventory = kvp.Value.GetComponent<PlayerResourceInventory>();
if (playerInventory != null)
{
// 플레이어가 자원을 가지고 있어야 함
return playerInventory.CurrentResourceAmount > 0;
}
}
@@ -297,13 +298,23 @@ namespace Northbound
[Rpc(SendTo.ClientsAndHost)]
private void UpdatePlayerResourcesClientRpc(ulong playerId)
{
var playerObject = NetworkManager.Singleton.ConnectedClients[playerId].PlayerObject;
if (playerObject != null)
// 해당 플레이어만 업데이트
if (NetworkManager.Singleton.LocalClientId != playerId)
return;
// 로컬 플레이어의 PlayerResourceInventory 찾아서 업데이트 요청
var spawnedObjects = NetworkManager.Singleton.SpawnManager.SpawnedObjects;
foreach (var kvp in spawnedObjects)
{
var playerInventory = playerObject.GetComponent<PlayerResourceInventory>();
if (playerInventory != null)
var controller = kvp.Value.GetComponent<NetworkPlayerController>();
if (controller != null && controller.IsLocalPlayer)
{
playerInventory.RequestResourceUpdateServerRpc();
var inventory = kvp.Value.GetComponent<PlayerResourceInventory>();
if (inventory != null)
{
inventory.RequestResourceUpdateServerRpc(playerId);
return;
}
}
}
}