113 lines
5.0 KiB
C#
113 lines
5.0 KiB
C#
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");
|
|
}
|
|
}
|
|
} |