Files
modular-vr/Assets/Escape Room Engine/Portal/PortalDriverClone.cs
2022-10-10 21:14:16 +02:00

45 lines
1.7 KiB
C#

using UnityEngine;
using UnityEngine.InputSystem.XR;
using UnityEngine.XR.Interaction.Toolkit;
namespace Escape_Room_Engine.Portal
{
public class PortalDriverClone : MonoBehaviour
{
/// <summary>
/// The portal where this clone is mirroring the portal driver.
/// </summary>
[HideInInspector] public Portal portal;
public static PortalDriverClone Create(PortalDriver portalDriver)
{
// copy the portal driver object
var clone = Instantiate(portalDriver).gameObject;
// destroy all unnecessary components
Destroy(clone.GetComponent<PortalDriver>());
foreach (var xrGrabInteractable in clone.GetComponentsInChildren<XRGrabInteractable>())
Destroy(xrGrabInteractable);
foreach (var rigidbody in clone.GetComponentsInChildren<Rigidbody>())
Destroy(rigidbody);
foreach (var trackedPoseDriver in clone.GetComponentsInChildren<TrackedPoseDriver>())
Destroy(trackedPoseDriver);
// add a clone component
clone.AddComponent<PortalDriverClone>();
// set up the clone
var portalDriverClone = clone.GetComponent<PortalDriverClone>();
portalDriverClone.gameObject.SetActive(false);
return portalDriverClone;
}
public void UpdatePosition(Transform cloning)
{
var m = portal.transform.localToWorldMatrix * Portal.HalfRotation *
portal.linkedPortal.transform.worldToLocalMatrix * cloning.localToWorldMatrix;
transform.SetPositionAndRotation(m.GetPosition(), m.rotation);
}
}
}