Files
Stair_Horror/Assets/Scripts/DoorController.cs

82 lines
2.4 KiB
C#

using UnityEngine;
public class DoorController : MonoBehaviour, IInteractable
{
[Header("Movement Settings")]
public float openAngle = 90f; // How far the door swings (usually 90 or -90)
public float smoothSpeed = 2f; // How fast it opens
private bool isOpen = false;
[Header("Horror Mechanics")]
[Range(0f, 1f)] public float stuckChance = 0.1f; // 10% chance to fail
public float rattleStrength = 5f; // How much it shakes if stuck
[Header("Audio")]
public AudioSource audioSource;
public AudioClip openSound;
public AudioClip closeSound;
public AudioClip stuckSound; // Sound of handle jiggling or locked thud
// Internal State
private Quaternion initialRotation;
private Quaternion targetRotation;
void Start()
{
// Remember how the door was rotated at the start
initialRotation = transform.localRotation;
targetRotation = initialRotation;
// Auto-fetch audio source if missed
if (audioSource == null) audioSource = GetComponent<AudioSource>();
}
void Update()
{
// Smoothly rotate the door towards the target rotation every frame
transform.localRotation = Quaternion.Slerp(transform.localRotation, targetRotation, Time.deltaTime * smoothSpeed);
}
public void Interact()
{
// 1. Calculate "Stuck" Mechanic
// Only checking stuck chance if we are trying to OPEN it (closing usually doesn't jam)
if (!isOpen && Random.value < stuckChance)
{
PlaySound(stuckSound);
// Optional: Add a tiny visual "shake" here if you want advanced polish
return;
}
// 2. Toggle State
isOpen = !isOpen;
// 3. Set Target Rotation
if (isOpen)
{
// Calculate rotation based on the openAngle
targetRotation = initialRotation * Quaternion.Euler(0, openAngle, 0);
PlaySound(openSound);
}
else
{
// Return to start
targetRotation = initialRotation;
PlaySound(closeSound);
}
}
void PlaySound(AudioClip clip)
{
if (audioSource != null && clip != null)
{
audioSource.PlayOneShot(clip);
}
}
public string GetDescription()
{
if (isOpen) return "Press [E] to <color=yellow>Close</color>";
else return "Press [E] to <color=yellow>Open</color>";
}
}