Unity_1lab/1 laba/Assets/Scripts/Door.cs
2025-09-15 19:16:35 +03:00

95 lines
3.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using NavKeypad;
using UnityEngine;
public class Door : OpenableObject
{
[SerializeField] private float rotateByDegrees = -90f;
[SerializeField] private float enemyDetectionRange = 3f; // Радиус обнаружения врага
[SerializeField] private Collider doorCollider; // Коллайдер двери
[SerializeField] private float openTime = 0.5f; // Время открытия двери (уменьшено для скорости)
[SerializeField] private float closeTime = 1f; // Время закрытия двери
[SerializeField] private bool isForbiddenForEnemy = false; // Время закрытия двери
private Vector3 startRotation;
private Vector3 endRotation;
private bool isMoving;
private bool isOpen;
void Start()
{
startRotation = transform.rotation.eulerAngles;
endRotation = startRotation + Vector3.up * rotateByDegrees;
isOpen = false;
}
void Update()
{
// Проверяем, есть ли враг рядом, и дверь не движется
if (!isMoving && !isOpen && !isForbiddenForEnemy)
{
Collider[] colliders = Physics.OverlapSphere(transform.position, enemyDetectionRange);
foreach (Collider col in colliders)
{
if (col.CompareTag("Enemy")) // У врага должен быть тег "Enemy"
{
StartCoroutine(Open());
break;
}
}
}
}
public override IEnumerator Open()
{
isMoving = true;
isOpen = true;
// Отключаем коллайдер, чтобы враг мог пройти
if (doorCollider != null)
{
doorCollider.enabled = false;
}
float timer = 0f;
while (timer < 1f)
{
timer += Time.deltaTime / openTime;
openOrCloseLerp = timer; // Обновляем значение для возможного использования в базовом классе
transform.rotation = Quaternion.Lerp(Quaternion.Euler(startRotation), Quaternion.Euler(endRotation), timer);
yield return null;
}
isMoving = false;
}
public override IEnumerator Close()
{
isMoving = true;
isOpen = false;
// Включаем коллайдер обратно
if (doorCollider != null)
{
doorCollider.enabled = true;
}
float timer = 0f;
while (timer < 1f)
{
timer += Time.deltaTime / closeTime;
openOrCloseLerp = 1f - timer; // Обновляем для обратного движения
transform.rotation = Quaternion.Lerp(Quaternion.Euler(startRotation), Quaternion.Euler(endRotation), 1f - timer);
yield return null;
}
isMoving = false;
}
// Визуализация радиуса обнаружения в редакторе
void OnDrawGizmosSelected()
{
Gizmos.color = Color.green;
Gizmos.DrawWireSphere(transform.position, enemyDetectionRange);
}
}