DeltaVR/Assets/_PROJECT/Multiplayer/Scripts/XROwnershipRequester.cs
2023-05-08 15:56:10 +03:00

51 lines
2.1 KiB
C#

using System.Collections.Generic;
using FishNet.Component.Transforming;
using FishNet.Connection;
using FishNet.Managing;
using FishNet.Object;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;
namespace _PROJECT.Multiplayer
{
public class XROwnershipRequester : NetworkBehaviour
{
[ServerRpc(RequireOwnership = false)]
private void SendOwnershipRequest(NetworkObject networkObject, NetworkConnection conn = null)
{
NetworkTransform networkTransform = networkObject.GetComponent<NetworkTransform>();
if (conn == null) return;
if (networkTransform != null) networkTransform.GiveOwnership(conn);
networkObject.GiveOwnership(conn);
}
[ServerRpc(RequireOwnership = false)]
private void RemoveOwnership(NetworkObject networkObject, NetworkConnection conn = null)
{
NetworkTransform networkTransform = networkObject.GetComponent<NetworkTransform>();
if (conn == null) return;
if (networkTransform != null) networkTransform.RemoveOwnership();
networkObject.RemoveOwnership();
}
public void OnSelectEnter(SelectEnterEventArgs eventArgs)
{
Debug.Log("Requesting ownership of " + eventArgs.interactableObject.transform.name);
NetworkObject networkObject = eventArgs.interactableObject.transform.GetComponent<NetworkObject>();
if (networkObject != null)
SendOwnershipRequest(networkObject);
}
public void OnSelectExit(SelectExitEventArgs eventArgs)
{
// If the object is still selected, don't remove ownership. This is for multiselect support.
if (eventArgs.interactableObject.isSelected) return;
Debug.Log("Unrequesting ownership of " + eventArgs.interactableObject.transform.name);
NetworkObject networkObject = eventArgs.interactableObject.transform.GetComponent<NetworkObject>();
if (networkObject != null)
RemoveOwnership(networkObject);
}
}
}