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

관련 문제가 다시 발생하면 이 커밋으로 돌아올 것
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

@@ -3,74 +3,57 @@ using UnityEngine;
namespace Northbound
{
/// <summary>
/// 플레이어의 자원 인벤토리 관리
/// </summary>
public class PlayerResourceInventory : NetworkBehaviour
{
[Header("Inventory Settings")]
public int maxResourceCapacity = 100; // 최대 자원 보유량
public int maxResourceCapacity = 100;
private int _displayAmount = 0;
private NetworkVariable<int> _currentResourceAmount = new NetworkVariable<int>(
0,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Server
);
public int CurrentResourceAmount => _currentResourceAmount.Value;
public int CurrentResourceAmount => _displayAmount;
public int MaxResourceCapacity => maxResourceCapacity;
/// <summary>
/// 자원을 추가할 수 있는지 확인
/// </summary>
public override void OnNetworkSpawn()
{
if (IsClient && IsOwner)
{
RequestResourceUpdateServerRpc();
}
}
[Rpc(SendTo.Server)]
public void RequestResourceUpdateServerRpc()
{
var resourceManager = ServerResourceManager.Instance;
if (resourceManager != null)
{
int amount = resourceManager.GetPlayerResourceAmount(OwnerClientId);
UpdateResourceAmountClientRpc(amount);
}
}
[Rpc(SendTo.ClientsAndHost)]
private void UpdateResourceAmountClientRpc(int amount)
{
_displayAmount = amount;
}
public bool CanAddResource(int amount)
{
return _currentResourceAmount.Value + amount <= maxResourceCapacity;
var resourceManager = ServerResourceManager.Instance;
if (resourceManager != null)
{
return resourceManager.CanAddResource(OwnerClientId, amount);
}
return false;
}
/// <summary>
/// 추가 가능한 최대 자원량 계산
/// </summary>
public int GetAvailableSpace()
{
return maxResourceCapacity - _currentResourceAmount.Value;
}
/// <summary>
/// 자원 추가 (서버에서만 호출)
/// </summary>
[Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)]
public void AddResourceServerRpc(int amount)
{
if (amount <= 0) return;
int actualAmount = Mathf.Min(amount, maxResourceCapacity - _currentResourceAmount.Value);
_currentResourceAmount.Value += actualAmount;
Debug.Log($"플레이어 {OwnerClientId} - 자원 추가: +{actualAmount}, 현재: {_currentResourceAmount.Value}/{maxResourceCapacity}");
}
/// <summary>
/// 자원 제거 (서버에서만 호출)
/// </summary>
[Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)]
public void RemoveResourceServerRpc(int amount)
{
if (amount <= 0) return;
int actualAmount = Mathf.Min(amount, _currentResourceAmount.Value);
_currentResourceAmount.Value -= actualAmount;
Debug.Log($"플레이어 {OwnerClientId} - 자원 사용: -{actualAmount}, 현재: {_currentResourceAmount.Value}/{maxResourceCapacity}");
}
/// <summary>
/// 자원 설정 (서버에서만 호출)
/// </summary>
[Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)]
public void SetResourceServerRpc(int amount)
{
_currentResourceAmount.Value = Mathf.Clamp(amount, 0, maxResourceCapacity);
var resourceManager = ServerResourceManager.Instance;
if (resourceManager != null)
{
return resourceManager.GetAvailableSpace(OwnerClientId);
}
return 0;
}
}
}
}