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; } } } }