initial commit
This commit is contained in:
75
Assets/Scripts/InteractiveDoor.cs
Normal file
75
Assets/Scripts/InteractiveDoor.cs
Normal file
@@ -0,0 +1,75 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user