58 lines
1.9 KiB
C#
58 lines
1.9 KiB
C#
using System;
|
|
using FishNet.Object;
|
|
using FishNet.Object.Synchronizing;
|
|
using UnityEngine;
|
|
|
|
namespace _PROJECT.Multiplayer
|
|
{
|
|
public class ParentSync : NetworkBehaviour
|
|
{
|
|
[SyncVar] public NetworkObject parentNetworkObject;
|
|
public override void OnStartClient()
|
|
{
|
|
base.OnStartClient();
|
|
transform.parent = parentNetworkObject == null ? null : parentNetworkObject.transform;
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
// Throw error if parent does not have a network object
|
|
if (transform.parent != null && transform.parent.GetComponent<NetworkObject>() == null)
|
|
{
|
|
throw new Exception("ParentSync must be on a child of a network object.");
|
|
}
|
|
parentNetworkObject = transform.parent == null ? null : transform.parent.GetComponent<NetworkObject>();
|
|
}
|
|
|
|
private void OnTransformParentChanged()
|
|
{
|
|
if (!IsOwner || !IsServer) return;
|
|
|
|
// Get new parent's network object.
|
|
NetworkObject newParent = transform.parent == null ? null : transform.parent.GetComponent<NetworkObject>();
|
|
|
|
if (newParent == null)
|
|
{
|
|
Debug.LogWarning("ParentSync: New parent is not a network object.");
|
|
return;
|
|
}
|
|
|
|
SetParentRPC(GetComponent<NetworkObject>(),
|
|
newParent);
|
|
}
|
|
|
|
[ServerRpc(RequireOwnership = false)]
|
|
private void SetParentRPC(NetworkObject obj, NetworkObject newParent)
|
|
{
|
|
transform.parent = newParent == null ? null : newParent.transform;
|
|
parentNetworkObject = newParent;
|
|
SetParentBroadcastRPC(obj, newParent);
|
|
}
|
|
|
|
[ObserversRpc]
|
|
private void SetParentBroadcastRPC(NetworkObject obj, NetworkObject newParent)
|
|
{
|
|
transform.parent = newParent == null ? null : newParent.transform;
|
|
}
|
|
}
|
|
} |