클라이언트 접속 전에 스폰되어 있는 오브젝트의 경우, Ownership이 Distributable일 경우 클라이언트 접속 시점에 Ownership을 호스트로부터 분배받는다. 서버만 데이터를 수정해야 하는 환경이기 때문에 대부분 Distributable 대신 None을 사용하면 된다.
76 lines
2.1 KiB
C#
76 lines
2.1 KiB
C#
using Unity.Netcode;
|
|
using UnityEngine;
|
|
|
|
namespace Northbound
|
|
{
|
|
public class PlayerResourceInventory : NetworkBehaviour
|
|
{
|
|
public int maxResourceCapacity = 100;
|
|
private int _displayAmount = 0;
|
|
|
|
public int CurrentResourceAmount => _displayAmount;
|
|
public int MaxResourceCapacity => maxResourceCapacity;
|
|
|
|
[Rpc(SendTo.Server)]
|
|
private void SetMaxCapacityServerRpc(int maxCapacity)
|
|
{
|
|
var resourceManager = ServerResourceManager.Instance;
|
|
if (resourceManager != null)
|
|
{
|
|
resourceManager.SetPlayerMaxCapacity(OwnerClientId, maxCapacity);
|
|
}
|
|
}
|
|
|
|
public override void OnNetworkSpawn()
|
|
{
|
|
if (IsClient && IsOwner)
|
|
{
|
|
SetMaxCapacityServerRpc(maxResourceCapacity);
|
|
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 void UpdateResourceAmountDirectly(int amount)
|
|
{
|
|
_displayAmount = amount;
|
|
}
|
|
|
|
public bool CanAddResource(int amount)
|
|
{
|
|
var resourceManager = ServerResourceManager.Instance;
|
|
if (resourceManager != null)
|
|
{
|
|
return resourceManager.CanAddResource(OwnerClientId, amount);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public int GetAvailableSpace()
|
|
{
|
|
var resourceManager = ServerResourceManager.Instance;
|
|
if (resourceManager != null)
|
|
{
|
|
return resourceManager.GetAvailableSpace(OwnerClientId);
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
}
|