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); } }