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

232 lines
6.4 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace InfallibleCode
{
public class DoorTestDraggable : MonoBehaviour, IInteractable
{
public Transform door;
public bool DoorRequiresKey;
public bool DoorIsOpen;
public float RotationSpeed = 2;
[Range(0, -90)]
public float DoorStartAngle = -90f;
[Header("!DEBUGGING!")]
[HideInInspector] public bool CanOpenDoor = true;
public int doorSide;
private float doorLerp;
[HideInInspector] public float _doorLerpOpenAngle = 0f;
[HideInInspector] public float _doorLerpSpeed = 0.5f;
private Quaternion _OpenPos;
private Quaternion _ClosedPos;
public bool doorIsOpeningOrClosing;
void Awake()
{
if (door == null)
{
door = GetComponent<Transform>();
}
}
void Start()
{
if (DoorRequiresKey)
{
CanOpenDoor = false;
}
door.transform.localRotation = Quaternion.Euler(door.localEulerAngles.x, DoorStartAngle, door.localEulerAngles.z);
_OpenPos = Quaternion.Euler(door.localEulerAngles.x, -90f, door.localEulerAngles.z);
_ClosedPos = Quaternion.Euler(door.localEulerAngles.x, 0f, door.localEulerAngles.z);
if(DoorStartAngle >= 0f)
{
DoorIsOpen = false;
}
if(DoorStartAngle <= -90f)
{
DoorIsOpen = true;
}
}
public void DragDoor()
{
#region Door Drag
if (CanOpenDoor && !doorIsOpeningOrClosing)
{
if (DoorIsOpen)
{
CloseDoor(0.5f);
StartCoroutine(DoorOpenFalse());
doorIsOpeningOrClosing = true;
}
else
{
OpenDoor(0.5f);
StartCoroutine(DoorOpenTrue());
doorIsOpeningOrClosing = true;
}
}
else if (DoorRequiresKey)
{
Debug.Log("Door is locked");
}
else
{
Debug.Log("Door is jammed");
}
}
#endregion
IEnumerator DoorOpenFalse()
{
while (doorLerp >= 1f)
{
DoorIsOpen = false;
yield return null;
}
}
IEnumerator DoorOpenTrue()
{
while (doorLerp >= 1f)
{
DoorIsOpen = true;
yield return null;
}
}
IEnumerator DoorAnglesUpdate()
{
while (doorLerp <= 1f)
{
float DoorAngle = door.transform.localEulerAngles.y;
DoorAngle = (DoorAngle > 180) ? DoorAngle - 360 : DoorAngle;
if (DoorAngle <= -90f)
{
print("Door Rotation.Y is -90f (Door Angle -90f)");
DoorIsOpen = true;
doorLerp = 0f;
}
if (DoorAngle < -0.01f)
{
//CloseDoor(1f);
print("Door Rotation.Y is -90f (Door Angle -0.01f)");
DoorIsOpen = true;
doorLerp = 0f;
}
if (DoorAngle >= 0f)
{
print("Door Rotation.Y is 0f (Door Angle 0f)");
DoorIsOpen = false;
doorLerp = 0f;
}
yield return null;
}
}
public void Interact()
{
DragDoor();
}
public void LockDoor()
{
DoorRequiresKey = true;
CanOpenDoor = false;
}
public void UnlockDoor()
{
DoorRequiresKey = false;
CanOpenDoor = true;
}
#region Open Door
public void OpenDoor(float doorLerpSpeed)
{
doorLerp = 0f;
DoorIsOpen = true;
StartCoroutine(OpenDoorCoroutine(doorLerpSpeed));
}
IEnumerator OpenDoorCoroutine(float doorLerpSpeed)
{
while (doorLerp <= 1f) /*(door.localEulerAngles.y <= -90f)*/
{
doorLerp += doorLerpSpeed * Time.deltaTime;
door.localRotation = Quaternion.Slerp(door.localRotation, _OpenPos, doorLerp);
print("Door opens");
float DoorAngle = door.transform.localEulerAngles.y;
DoorAngle = (DoorAngle > 180) ? DoorAngle - 360 : DoorAngle;
if (DoorAngle <= -90f)
{
if (doorIsOpeningOrClosing)
{
doorIsOpeningOrClosing = false;
}
StopAllCoroutines();
}
yield return null;
}
if (doorIsOpeningOrClosing)
{
doorIsOpeningOrClosing = false;
}
}
#endregion
#region Close Door
public void CloseDoor(float doorLerpSpeed)
{
doorLerp = 0f;
DoorIsOpen = false;
StartCoroutine(CloseDoorCoroutine(doorLerpSpeed));
}
IEnumerator CloseDoorCoroutine(float doorLerpSpeed)
{
while (doorLerp <= 1f)/*(door.localEulerAngles.y >= 0f)*/
{
doorLerp += doorLerpSpeed * Time.deltaTime;
door.localRotation = Quaternion.Slerp(door.localRotation, _ClosedPos, doorLerp);
print("Door closes");
float DoorAngle = door.transform.localEulerAngles.y;
DoorAngle = (DoorAngle > 180) ? DoorAngle - 360 : DoorAngle;
if (DoorAngle >= -0.001f)
{
if (doorIsOpeningOrClosing)
{
doorIsOpeningOrClosing = false;
}
print("stop");
StopAllCoroutines();
}
yield return null;
}
if (doorIsOpeningOrClosing)
{
doorIsOpeningOrClosing = false;
}
}
#endregion
}
}