using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.Serialization; namespace InfallibleCode { public class LoopDoor : MonoBehaviour, IInteractable { public Transform lerpFakeDoorTargetPos; public Transform LoopedDoorTargetPos; public float lerpSpeed = 5.0f; [Header("Real door that opens the loop")] public DoorBehaviour doorThatLeadsToLoop; public Transform lerpRealDoorTargetPos; public bool shouldFireEventAfterEnteredLoop = true; [FormerlySerializedAs("eventToTriggerAfterEnteredLoop")] public UnityEvent eventToTriggerAfterStartedEnteringLoop; private bool isMoving = false; private Vector3 startPosition; private float journeyLength; public void Interact() { if(!isMoving) StartCoroutine(MovePlayerToFakeDoor()); } IEnumerator MovePlayerToFakeDoor() { isMoving = true; PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator.SetFloat("speedPercent", 0.5f); PlayerManager.GetInstance()._cameraMovement.enabled = false; PlayerManager.GetInstance()._PlayerMovement.enabled = false; startPosition = PlayerManager.GetInstance().PlayerCharacterController.transform.position; journeyLength = Vector3.Distance(startPosition, lerpFakeDoorTargetPos.position); float startTime = Time.time; while (Vector3.Distance(PlayerManager.GetInstance().PlayerCharacterController.transform.position, lerpFakeDoorTargetPos.position) >= 0.1f) { float distanceCovered = (Time.time - startTime) * lerpSpeed; float fractionOfJourney = distanceCovered / journeyLength; PlayerManager.GetInstance().PlayerCharacterController.Move(Vector3.Lerp(startPosition, lerpFakeDoorTargetPos.position, fractionOfJourney) - PlayerManager.GetInstance().PlayerCharacterController.transform.position); float rotationSpeed = 10f; // Adjust this value to change the rotation speed PlayerManager.GetInstance().PlayerCharacterController.transform.rotation = Quaternion.Slerp(PlayerManager.GetInstance().PlayerCharacterController.transform.rotation, lerpFakeDoorTargetPos.rotation, rotationSpeed * Time.fixedDeltaTime); yield return null; } TeleportPlayerInFrontOfLoopedDoor(); if (eventToTriggerAfterStartedEnteringLoop != null) { if (shouldFireEventAfterEnteredLoop) { eventToTriggerAfterStartedEnteringLoop.Invoke(); } } isMoving = false; print("lerp of player to fake door ended"); } void TeleportPlayerInFrontOfLoopedDoor() { PlayerManager.GetInstance().PlayerCharacterController.enabled = false; PlayerManager.GetInstance().playerGameObj.transform.position = LoopedDoorTargetPos.position; PlayerManager.GetInstance().PlayerCharacterController.enabled = true; doorThatLeadsToLoop.UnlockDoor(); doorThatLeadsToLoop.OpenDoor(0.5f); StartCoroutine(MovePlayerThroughRealDoor()); } IEnumerator MovePlayerThroughRealDoor() { isMoving = true; startPosition = PlayerManager.GetInstance().PlayerCharacterController.transform.position; journeyLength = Vector3.Distance(startPosition, lerpRealDoorTargetPos.position); PlayerManager.GetInstance().PlayerCharacterController.transform.rotation = LoopedDoorTargetPos.rotation; float startTime = Time.time; while (Vector3.Distance(PlayerManager.GetInstance().PlayerCharacterController.transform.position, lerpRealDoorTargetPos.position) >= 0.1f) { float distanceCovered = (Time.time - startTime) * lerpSpeed; float fractionOfJourney = distanceCovered / journeyLength; PlayerManager.GetInstance().PlayerCharacterController.Move(Vector3.Lerp(startPosition, lerpRealDoorTargetPos.position, fractionOfJourney) - PlayerManager.GetInstance().PlayerCharacterController.transform.position); yield return null; } doorThatLeadsToLoop.StopDoorCoroutines(); doorThatLeadsToLoop.CloseDoor(1f); doorThatLeadsToLoop.LockDoor(); PlayerManager.GetInstance()._cameraMovement.enabled = true; PlayerManager.GetInstance()._PlayerMovement.enabled = true; PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator.SetFloat("speedPercent", 0f); isMoving = false; //if (eventToTriggerAfterStartedEnteringLoop != null) //{ // if (shouldFireEventAfterEnteredLoop) // { // eventToTriggerAfterStartedEnteringLoop.Invoke(); // } //} print("lerp of player to real door ended"); } } }