using UnityEngine; using System.Collections; using UnityEngine.Events; public class teleportationPlatform : MonoBehaviour { [Header ("Main Settings")] [Space] public bool teleportEnabled = true; public Transform platformToMove; public LayerMask layermask; public bool useButtonToActivate; [Space] [Header ("Check Layer Settings")] [Space] public bool checkObjectLayerToTeleport; public LayerMask objectLayerToTeleport; public bool ignoreVehiclesToTeleport; public float vehicleRadiusMultiplier = 0.5f; [Space] [Header ("Rotation Settings")] [Space] public bool setObjectRotation; public bool setFullObjectRotation; public bool adjustPlayerCameraRotationIfPlayerTeleported; public Transform objectRotationTransform; [Space] [Header ("Gravity Settings")] [Space] public bool setGravityDirection; public setGravity setGravityManager; [Space] [Header ("Debug")] [Space] public GameObject objectInside; [Space] [Header ("Events Settings")] [Space] public bool callEventOnTeleport; public UnityEvent eventOnTeleport; public bool callEventOnEveryTeleport; [Space] [Header ("Components")] [Space] public teleportationPlatform platformToMoveManager; bool platformToMoveManagerLocated; bool eventCalled; RaycastHit hit; grabbedObjectState currentGrabbedObject; void OnTriggerEnter (Collider col) { if (!teleportEnabled) { return; } if (objectInside != null) { return; } GameObject currentObject = col.gameObject; if (checkObjectLayerToTeleport) { if ((1 << currentObject.layer & objectLayerToTeleport.value) != 1 << currentObject.layer) { return; } } if (ignoreVehiclesToTeleport) { if (applyDamage.isVehicle (currentObject)) { return; } } GameObject objectToTeleport = applyDamage.getCharacterOrVehicle (currentObject); if (objectToTeleport != null) { currentObject = objectToTeleport; } Rigidbody currentRigidbody = currentObject.GetComponent (); if (currentRigidbody == null) { return; } if (currentObject == null) { return; } objectInside = currentObject; //if the object is being carried by the player, make him drop it currentGrabbedObject = objectInside.GetComponent (); if (currentGrabbedObject != null) { if (currentGrabbedObject.isCarryingObjectPhysically ()) { objectInside = null; return; } else { GKC_Utils.dropObject (currentGrabbedObject.getCurrentHolder (), objectInside); } } if (!useButtonToActivate) { activateTeleport (); } } void OnTriggerExit (Collider col) { if (objectInside != null && col.gameObject == objectInside) { objectInside = null; currentGrabbedObject = null; } } public void removeObjectInside () { objectInside = null; } void activateDevice () { if (!teleportEnabled) { return; } if (useButtonToActivate && objectInside != null) { activateTeleport (); } } public void activateTeleport () { if (!platformToMoveManagerLocated) { if (platformToMove != null) { platformToMoveManager = platformToMove.GetComponent (); } platformToMoveManagerLocated = platformToMoveManager != null; } if (platformToMoveManagerLocated) { platformToMoveManager.sendObject (objectInside); removeObjectInside (); if (callEventOnTeleport) { if (!eventCalled || callEventOnEveryTeleport) { eventOnTeleport.Invoke (); eventCalled = true; } } } } public void sendObject (GameObject objectToMove) { Vector3 targetPosition = transform.position + transform.up * 0.3f; if (Physics.Raycast (transform.position + transform.up * 2, -transform.up, out hit, Mathf.Infinity, layermask)) { targetPosition = hit.point; objectInside = objectToMove; } bool objectIsVehicle = applyDamage.isVehicle (objectToMove); if (objectIsVehicle) { float vehicleRadius = applyDamage.getVehicleRadius (objectToMove); if (vehicleRadius != -1) { targetPosition += objectToMove.transform.up * vehicleRadius * vehicleRadiusMultiplier; } } objectToMove.transform.position = targetPosition; if (setObjectRotation) { if (setFullObjectRotation) { objectToMove.transform.rotation = objectRotationTransform.rotation; } else { float rotationAngle = Vector3.SignedAngle (objectToMove.transform.forward, objectRotationTransform.forward, objectToMove.transform.up); objectToMove.transform.Rotate (objectToMove.transform.up * rotationAngle); } bool objectIsCharacter = applyDamage.isCharacter (objectToMove); if (objectIsCharacter) { if (adjustPlayerCameraRotationIfPlayerTeleported) { playerController currentPlayerController = objectToMove.GetComponent (); if (currentPlayerController != null) { currentPlayerController.getPlayerCameraGameObject ().transform.rotation = objectToMove.transform.rotation; } } } } if (setGravityDirection && setGravityManager != null) { Collider currentCollider = objectToMove.GetComponent (); if (currentCollider != null) { setGravityManager.checkTriggerType (currentCollider, true); } } } public void setTeleportEnabledState (bool state) { teleportEnabled = state; } }