/* * author: ryan lin * date: 8/8/2024 * description: door interaction and animation */ using System; using System.Collections; using System.Collections.Generic; using UnityEngine; /// /// TODO /// public class Door : CommonInteractable { /// /// TODO /// public enum DoorType { Sliding, Rotating } /// /// TODO /// public List doors; /// /// TODO /// public float duration; /// /// TODO /// public AnimationCurve curve; /// /// TODO /// private bool _isOpen; /// /// TODO /// private bool _opening; /// /// TODO /// public override void Interact() { if (!_opening) StartCoroutine(OpenDoor()); } /// /// TODO /// private IEnumerator OpenDoor() { _opening = true; float currentDuration = 0; while (_opening) { currentDuration += Time.deltaTime; var t = currentDuration / duration; foreach (var variable in doors) if (!_isOpen) { if (variable.type == DoorType.Sliding) variable.doorObject.transform.localPosition = Vector3.Lerp(variable.startPosition, variable.endPosition, curve.Evaluate(t)); else if (variable.type == DoorType.Rotating) variable.doorObject.transform.localEulerAngles = Vector3.Slerp(variable.startPosition, variable.endPosition, curve.Evaluate(t)); } else { if (variable.type == DoorType.Sliding) variable.doorObject.transform.localPosition = Vector3.Lerp(variable.endPosition, variable.startPosition, curve.Evaluate(t)); else if (variable.type == DoorType.Rotating) variable.doorObject.transform.localEulerAngles = Vector3.Slerp(variable.endPosition, variable.startPosition, curve.Evaluate(t)); } if (currentDuration >= duration) { currentDuration = 0; _opening = false; _isOpen = !_isOpen; } yield return new WaitForEndOfFrame(); } } /// /// TODO /// // NOTE: why is this at the bottom lol [Serializable] public struct DoorInput { public GameObject doorObject; public Vector3 startPosition; public DoorType type; public Vector3 endPosition; } }