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