76 lines
2.2 KiB
C#
76 lines
2.2 KiB
C#
using System.Collections;
|
|
using UnityEngine;
|
|
|
|
public class InteractiveDoor : MonoBehaviour
|
|
{
|
|
[Header("Door Movement")]
|
|
[SerializeField] private Vector3 openOffsetPosition = new Vector3(0, 3.5f, 0); // e.g. sliding up
|
|
[SerializeField] private Vector3 openRotationEuler = Vector3.zero; // or swinging open
|
|
[SerializeField] private float transitionSpeed = 3f;
|
|
|
|
[Header("Behavior")]
|
|
[SerializeField] private bool openOnAreaCleared = true;
|
|
[SerializeField] private bool openOnTriggerEnter = false;
|
|
|
|
[Header("Audio")]
|
|
[SerializeField] private AudioClip doorOpenSound;
|
|
|
|
private Vector3 closedPosition;
|
|
private Quaternion closedRotation;
|
|
private Vector3 targetPosition;
|
|
private Quaternion targetRotation;
|
|
private bool isOpen = false;
|
|
|
|
private void Awake()
|
|
{
|
|
closedPosition = transform.position;
|
|
closedRotation = transform.rotation;
|
|
targetPosition = closedPosition;
|
|
targetRotation = closedRotation;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (openOnAreaCleared && !isOpen && AreaClearanceManager.Instance != null && AreaClearanceManager.Instance.IsAreaCleared)
|
|
{
|
|
OpenDoor();
|
|
}
|
|
|
|
transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * transitionSpeed);
|
|
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * transitionSpeed);
|
|
}
|
|
|
|
private void OnTriggerEnter(Collider other)
|
|
{
|
|
if (openOnTriggerEnter && !isOpen && other.CompareTag("Player"))
|
|
{
|
|
OpenDoor();
|
|
}
|
|
}
|
|
|
|
public void OpenDoor()
|
|
{
|
|
if (isOpen) return;
|
|
isOpen = true;
|
|
|
|
targetPosition = closedPosition + transform.TransformDirection(openOffsetPosition);
|
|
if (openRotationEuler != Vector3.zero)
|
|
{
|
|
targetRotation = closedRotation * Quaternion.Euler(openRotationEuler);
|
|
}
|
|
|
|
if (doorOpenSound != null)
|
|
{
|
|
AudioSource.PlayClipAtPoint(doorOpenSound, transform.position);
|
|
}
|
|
}
|
|
|
|
public void CloseDoor()
|
|
{
|
|
isOpen = false;
|
|
targetPosition = closedPosition;
|
|
targetRotation = closedRotation;
|
|
}
|
|
}
|
|
|