86 lines
2.5 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Unity.XR.CoreUtils;
using UnityEngine;
using UnityEngine.XR;
public class StencilPortal : MonoBehaviour
{
public bool destroyAfterTeleport;
public StencilPortal targetPortal;
public Transform normalVisible;
public Transform normalInvisible;
public LayerMask defaultLayer;
public LayerMask portalLayer;
public PortalScene portalScene;
public OcclusionPortal occlusionPortal;
public bool _shouldTeleport;
public static Vector3 TransformPositionBetweenPortals(StencilPortal sender, StencilPortal target, Vector3 position)
{
return
target.normalInvisible.TransformPoint(
sender.normalVisible.InverseTransformPoint(position));
}
public static Quaternion TransformRotationBetweenPortals(StencilPortal sender, StencilPortal target, Quaternion rotation)
{
return
target.normalInvisible.rotation *
Quaternion.Inverse(sender.normalVisible.rotation) *
rotation;
}
private void OnTriggerEnter(Collider other)
{
if (!other.CompareTag("Player")) return;
if (occlusionPortal != null)
{
occlusionPortal.open = !occlusionPortal.open;
}
if (!_shouldTeleport)
{
if (destroyAfterTeleport)
{
Destroy(gameObject, 0.5f);
}
return;
}
Debug.Log(transform.name + " player entered and should teleport");
targetPortal._shouldTeleport = false;
// Move player to target portal collider relative position
other.transform.position = TransformPositionBetweenPortals(this, targetPortal, other.transform.position);
other.transform.rotation = TransformRotationBetweenPortals(this, targetPortal, other.transform.rotation);
if (destroyAfterTeleport)
{
Destroy(gameObject, 0.5f);
}
}
private void OnTriggerExit(Collider other)
{
/*if (!_shouldTeleport || IsInvoking(nameof(AllowTeleport))) return;
if (!other.CompareTag("Player")) return;
Debug.Log(transform.name + " player exited");
Invoke(nameof(AllowTeleport), 1f);*/
}
private void AllowTeleport()
{
_shouldTeleport = true;
}
public StencilPortal TargetPortal => targetPortal;
public LayerMask DefaultLayer => defaultLayer;
public LayerMask PortalLayer => portalLayer;
}