using UnityEngine; using System.Collections; public class Door : MonoBehaviour, IInteract { [SerializeField] bool isLocked; [SerializeField] string requiredKeyTag; [SerializeField] GameObject door; [SerializeField] float rotationAngle = 90f; [SerializeField] bool requiresReview = true; bool isOpen = false; public void OnInteract() { if (isLocked) { StartCoroutine(LockedDoorShake()); // Shake the door to indicate it's locked } else { if (isOpen) { StartCoroutine(ClosingDoor()); // Close the door by rotating it back isOpen = false; } else { StartCoroutine(OpeningDoor()); // Simple door opening by rotating it 90 degrees on the Y-axis isOpen = true; } } } IEnumerator OpeningDoor() { float elapsedTime = 0f; float duration = 1f; // Duration of the door opening animation Quaternion initialRotation = door.transform.rotation; Quaternion targetRotation = initialRotation * Quaternion.Euler(0, -rotationAngle, 0); while (elapsedTime < duration) { door.transform.rotation = Quaternion.Slerp(initialRotation, targetRotation, elapsedTime / duration); elapsedTime += Time.deltaTime; yield return null; } door.transform.rotation = targetRotation; // Ensure it ends at the exact target rotation ReviewObject(); } private void ReviewObject() { // Notify LevelManager for review after animation completes if (requiresReview && LevelManager.Instance != null) { LevelManager.Instance.RequestReview(gameObject); } } IEnumerator ClosingDoor() { float elapsedTime = 0f; float duration = 1f; // Duration of the door closing animation Quaternion initialRotation = door.transform.rotation; Quaternion targetRotation = initialRotation * Quaternion.Euler(0, rotationAngle, 0); while (elapsedTime < duration) { door.transform.rotation = Quaternion.Slerp(initialRotation, targetRotation, elapsedTime / duration); elapsedTime += Time.deltaTime; yield return null; } door.transform.rotation = targetRotation; // Ensure it ends at the exact target rotation ReviewObject(); } IEnumerator LockedDoorShake() { float elapsedTime = 0f; float duration = 0.5f; // Duration of the shake Quaternion originalRotation = door.transform.rotation; while (elapsedTime < duration) { float yOffset = Random.Range(-1f, 1f); door.transform.rotation = originalRotation * Quaternion.Euler(0, yOffset, 0); elapsedTime += Time.deltaTime; yield return null; } door.transform.rotation = originalRotation; // Reset to original rotation after shaking ReviewObject(); } }