Files
HauntedBloodlines/Assets/Scripts/LoopDoor.cs
2025-05-29 22:31:40 +03:00

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