forked from cgvr/DeltaVR
deltavr multiplayer 2.0
This commit is contained in:
86
Assets/_PROJECT/Components/Portals2/StencilPortal.cs
Normal file
86
Assets/_PROJECT/Components/Portals2/StencilPortal.cs
Normal file
@@ -0,0 +1,86 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user