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 _portalCanBeUsed; private bool _enabled; private float _lastUsed; private bool _justUsed; private Transform traveller; public AudioClip TeleportSound; // poopy code, can be done much more efficient if this class is rewritten and attached to Portal parent object private AudioSource audioSource; private GameObject vfx_gameobject; private void Start() { linkedPortalTransform = linkedPortal.transform; _portalCanBeUsed = true; vfx_gameobject = transform.parent.Find("PortalFX").gameObject; audioSource = transform.parent.GetComponent(); audioSource.mute = true; if (_enabled) { vfx_gameobject.SetActive(true); } else { vfx_gameobject.SetActive(false); } } void OnTriggerEnter(Collider other) { traveller = other.gameObject.transform; Debug.Log(_enabled); if (_portalCanBeUsed && !_justUsed && _enabled) { if (other.name.StartsWith("Holster")) { Debug.Log("holster"); } else { linkedPortal._portalCanBeUsed = 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(); } } } } // Enable/Disable portal if selected item is in a socket. public void EnablePortal() { Debug.Log("enabled"); _enabled = true; linkedPortal._enabled = true; vfx_gameobject.SetActive(true); linkedPortal.vfx_gameobject.SetActive(true); audioSource.mute = false; } public void DisablePortal() { Debug.Log("disabled"); _enabled = false; linkedPortal._enabled = false; vfx_gameobject.SetActive(false); linkedPortal.vfx_gameobject.SetActive(false); audioSource.mute = true; } 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; // Teleport traveller.position = linkedPortalTransform.position + positionOffset; AudioSource.PlayClipAtPoint(TeleportSound, traveller.position, 1); _travellerIsOverlapping = false; _portalCanBeUsed = 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; _portalCanBeUsed = 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; _portalCanBeUsed = true; linkedPortal._portalCanBeUsed = true; } } } }