51 lines
2.1 KiB
C#
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);
|
|
}
|
|
}
|
|
} |