Files
LowPolyFPS/Assets/Scripts/InteractiveDoor.cs

76 lines
2.2 KiB
C#
Raw Permalink Normal View History

2026-10-12 21:28:47 +01:00
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;
}
}