Files
ClearTheZone/Assets/Scripts/Door_Rotate.cs
T
2026-06-18 13:53:07 +02:00

71 lines
2.0 KiB
C#

using UnityEngine;
public class Door_Rotate : MonoBehaviour
{
[SerializeField] private float openAngle = 90f;
[SerializeField] private float rotationSpeed = 2f;
[SerializeField] private float interactionDistance = 5f;
[SerializeField] private Vector3 rotationOffset = Vector3.zero;
private float targetRotation = 0f;
private float currentRotation = 0f;
private bool isOpen = false;
private Camera playerCamera;
private Vector3 pivotPoint;
void Start()
{
playerCamera = Camera.main;
currentRotation = transform.localEulerAngles.y;
targetRotation = currentRotation;
pivotPoint = transform.position + rotationOffset;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.E) && IsPlayerLooking())
{
ToggleDoor();
}
SmoothRotateDoor();
}
private void ToggleDoor()
{
isOpen = !isOpen;
targetRotation = isOpen ? currentRotation + openAngle : currentRotation - openAngle;
}
private void SmoothRotateDoor()
{
currentRotation = Mathf.Lerp(currentRotation, targetRotation, Time.deltaTime * rotationSpeed);
transform.RotateAround(pivotPoint, Vector3.up, (currentRotation - transform.localEulerAngles.y));
transform.localEulerAngles = new Vector3(
transform.localEulerAngles.x,
currentRotation,
transform.localEulerAngles.z
);
}
private bool IsPlayerLooking()
{
if (playerCamera == null) return false;
Ray ray = new Ray(playerCamera.transform.position, playerCamera.transform.forward);
float distanceToPlayer = Vector3.Distance(playerCamera.transform.position, transform.position);
if (distanceToPlayer > interactionDistance) return false;
if (Physics.Raycast(ray, out RaycastHit hit, interactionDistance))
{
return hit.collider.gameObject == gameObject;
}
return false;
}
}