232 lines
6.4 KiB
C#
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
|
|
}
|
|
} |