KitchenChaos/Assets/Scripts/KitchenGameMultiplayer.cs

56 lines
2.8 KiB
C#

using Unity.Netcode;
using UnityEngine;
public class KitchenGameMultiplayer : NetworkBehaviour {
[SerializeField] private KitchenObjectListSO kitchenObjectListSO;
public static KitchenGameMultiplayer Instance { get; private set; }
private void Awake() {
Instance = this;
}
public void SpawnKitchenObject(KitchenObjectSO kitchenObjectSO, IKitchenObjectParent kitchenObjectParent) {
SpawnKitchenObjectServerRpc(GetKitchenObjectSOIndex(kitchenObjectSO), kitchenObjectParent.GetNetworkObject());
}
[ServerRpc(RequireOwnership = false)]
public void SpawnKitchenObjectServerRpc(int kitchenObjectSOIndex, NetworkObjectReference kitchenObjectParentNetworkObjectReference) {
KitchenObjectSO kitchenObjectSO = GetKitchenObjectSOFromIndex(kitchenObjectSOIndex);
Transform kitchenObjectTransform = Instantiate(kitchenObjectSO.prefab);
NetworkObject kitchenObjectNetworkObject = kitchenObjectTransform.GetComponent<NetworkObject>();
kitchenObjectNetworkObject.Spawn(true);
KitchenObject kitchenObject = kitchenObjectTransform.GetComponent<KitchenObject>();
kitchenObjectParentNetworkObjectReference.TryGet(out NetworkObject kitchenObjectParentNetworkObject);
IKitchenObjectParent kitchenObjectParent = kitchenObjectParentNetworkObject.GetComponent<IKitchenObjectParent>();
kitchenObject.SetKitchenObjectParent(kitchenObjectParent);
Debug.Log($"Will spawn {kitchenObjectSO.objectName} on {kitchenObjectParent}...");
}
private int GetKitchenObjectSOIndex(KitchenObjectSO kitchenObjectSO) =>
kitchenObjectListSO.kitchenObjectSOList.IndexOf(kitchenObjectSO);
private KitchenObjectSO GetKitchenObjectSOFromIndex(int kitchenObjectSOIndex) =>
kitchenObjectListSO.kitchenObjectSOList[kitchenObjectSOIndex];
public void DestroyKitchenObject(KitchenObject kitchenObject) {
DestroyKitchenObjectServerRpc(kitchenObject.NetworkObject);
}
[ServerRpc(RequireOwnership = false)]
public void DestroyKitchenObjectServerRpc(NetworkObjectReference kitchenObjectNetworkObjectReference) {
kitchenObjectNetworkObjectReference.TryGet(out NetworkObject kitchenObjectNetworkObject);
KitchenObject kitchenObject = kitchenObjectNetworkObject.GetComponent<KitchenObject>();
ClearKitchenObjectOnParentClientRpc(kitchenObjectNetworkObjectReference);
kitchenObject.DestroySelf();
}
[ClientRpc]
public void ClearKitchenObjectOnParentClientRpc(NetworkObjectReference kitchenObjectNetworkObjectReference) {
kitchenObjectNetworkObjectReference.TryGet(out NetworkObject kitchenObjectNetworkObject);
KitchenObject kitchenObject = kitchenObjectNetworkObject.GetComponent<KitchenObject>();
kitchenObject.ClearKitchenObjectOnParent();
}
}