95 lines
3.2 KiB
C#
95 lines
3.2 KiB
C#
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);
|
||
}
|
||
} |