111 lines
3.5 KiB
C#
111 lines
3.5 KiB
C#
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
public class PortalTeleporter : MonoBehaviour
|
||
|
{
|
||
|
//public Transform player;
|
||
|
[SerializeField] private PortalTeleporter linkedPortal;
|
||
|
private Transform linkedPortalTransform;
|
||
|
private float _portalCooldown = 2.5f;
|
||
|
private bool _travellerIsOverlapping = false;
|
||
|
private bool _portalIsEnabled;
|
||
|
private float _lastUsed;
|
||
|
private bool _justUsed;
|
||
|
private Transform traveller;
|
||
|
public AudioClip TeleportSound;
|
||
|
|
||
|
private void Start()
|
||
|
{
|
||
|
linkedPortalTransform = linkedPortal.transform;
|
||
|
_portalIsEnabled = true;
|
||
|
}
|
||
|
|
||
|
void OnTriggerEnter(Collider other)
|
||
|
{
|
||
|
traveller = other.gameObject.transform;
|
||
|
if (_portalIsEnabled && !_justUsed)
|
||
|
{
|
||
|
linkedPortal._portalIsEnabled = false;
|
||
|
_travellerIsOverlapping = true;
|
||
|
if (other.tag == "Throwable")
|
||
|
{
|
||
|
Debug.Log("Portal entered by throwable");
|
||
|
HandleThrowable();
|
||
|
}
|
||
|
else if (other.tag == "Player")
|
||
|
{
|
||
|
Debug.Log("Portal entered by player");
|
||
|
HandlePlayer();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
private void HandlePlayer()
|
||
|
{
|
||
|
Vector3 portalToTraveller = traveller.position - transform.position;
|
||
|
float dotProduct = Vector3.Dot(transform.up, portalToTraveller);
|
||
|
// If true player is on right side of portal
|
||
|
if (dotProduct < 0f)
|
||
|
{
|
||
|
// teleport player
|
||
|
float rotationDiff = -Quaternion.Angle(transform.rotation, linkedPortalTransform.rotation);
|
||
|
rotationDiff += 180;
|
||
|
traveller.Rotate(Vector3.up, rotationDiff);
|
||
|
Vector3 positionOffset = Quaternion.Euler(0f, rotationDiff, 0f) * portalToTraveller;
|
||
|
traveller.position = linkedPortalTransform.position + positionOffset;
|
||
|
AudioSource.PlayClipAtPoint(TeleportSound, traveller.position, 1);
|
||
|
_travellerIsOverlapping = false;
|
||
|
_portalIsEnabled = false;
|
||
|
_lastUsed = Time.time;
|
||
|
_justUsed = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void HandleThrowable()
|
||
|
{
|
||
|
Vector3 portalToTraveller = traveller.position - transform.position;
|
||
|
float dotProduct = Vector3.Dot(transform.up, portalToTraveller);
|
||
|
// If true player is on right side of portal
|
||
|
if (dotProduct < 0f)
|
||
|
{
|
||
|
// teleport player
|
||
|
AudioSource.PlayClipAtPoint(TeleportSound, this.transform.position, 1);
|
||
|
float rotationDiff = -Quaternion.Angle(transform.rotation, linkedPortalTransform.rotation);
|
||
|
rotationDiff += 180;
|
||
|
traveller.Rotate(Vector3.up, rotationDiff);
|
||
|
Vector3 positionOffset = Quaternion.Euler(0f, rotationDiff, 0f) * portalToTraveller;
|
||
|
traveller.position = linkedPortalTransform.position + positionOffset;
|
||
|
_travellerIsOverlapping = false;
|
||
|
_portalIsEnabled = false;
|
||
|
_lastUsed = Time.time;
|
||
|
_justUsed = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void OnTriggerExit(Collider other)
|
||
|
{
|
||
|
if (other.tag == "Player" || other.tag == "Throwable")
|
||
|
{
|
||
|
_travellerIsOverlapping = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Update is called once per frame
|
||
|
void Update()
|
||
|
{
|
||
|
if (_justUsed)
|
||
|
{
|
||
|
if (_lastUsed + _portalCooldown < Time.time)
|
||
|
{
|
||
|
_justUsed = false;
|
||
|
_portalIsEnabled = true;
|
||
|
linkedPortal._portalIsEnabled = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
}
|