132 lines
5.0 KiB
C#
132 lines
5.0 KiB
C#
using UnityEngine;
|
||
using UnityEngine.AI;
|
||
using UnityEngine.SceneManagement; // Для перезапуска сцены при смерти
|
||
|
||
public class EnemyAI : MonoBehaviour
|
||
{
|
||
[Header("Настройки врага")]
|
||
public float detectionRange = 10f; // Радиус обнаружения игрока
|
||
public float attackRange = 2f; // Дистанция атаки (немедленная смерть)
|
||
public float patrolSpeed = 5f; // Скорость патрулирования
|
||
public float chaseSpeed = 9f; // Скорость преследования
|
||
|
||
[Header("Патрульные точки")]
|
||
public Transform[] patrolPoints; // Точки для патрулирования
|
||
|
||
private Transform player; // Ссылка на игрока
|
||
private NavMeshAgent agent; // Компонент NavMeshAgent
|
||
private Animator animator; // Компонент Animator
|
||
private int currentPatrolIndex; // Индекс текущей точки патруля
|
||
private enum EnemyState { Patrol, Chase, Attack } // Состояния врага
|
||
private EnemyState currentState = EnemyState.Patrol; // Текущее состояние
|
||
|
||
void Start()
|
||
{
|
||
// Находим компоненты
|
||
agent = GetComponent<NavMeshAgent>();
|
||
// animator = GetComponent<Animator>();
|
||
player = GameObject.FindGameObjectWithTag("Player").transform; // Убедись, что у игрока есть тег "Player"
|
||
|
||
// Настройка начальных параметров NavMeshAgent
|
||
agent.speed = patrolSpeed;
|
||
|
||
// Устанавливаем начальное состояние
|
||
if (patrolPoints.Length > 0)
|
||
{
|
||
agent.SetDestination(patrolPoints[currentPatrolIndex].position);
|
||
}
|
||
}
|
||
|
||
void Update()
|
||
{
|
||
// Проверяем дистанцию до игрока
|
||
float distanceToPlayer = Vector3.Distance(transform.position, player.position);
|
||
|
||
// Определяем состояние врага
|
||
if (distanceToPlayer <= attackRange)
|
||
{
|
||
currentState = EnemyState.Attack;
|
||
}
|
||
else if (distanceToPlayer <= detectionRange)
|
||
{
|
||
currentState = EnemyState.Chase;
|
||
}
|
||
else
|
||
{
|
||
currentState = EnemyState.Patrol;
|
||
}
|
||
|
||
// Выполняем действия в зависимости от состояния
|
||
switch (currentState)
|
||
{
|
||
case EnemyState.Patrol:
|
||
Patrol();
|
||
break;
|
||
case EnemyState.Chase:
|
||
ChasePlayer();
|
||
break;
|
||
case EnemyState.Attack:
|
||
KillPlayer();
|
||
break;
|
||
}
|
||
|
||
// Обновляем анимации
|
||
// UpdateAnimations();
|
||
}
|
||
|
||
void Patrol()
|
||
{
|
||
agent.speed = patrolSpeed; // Устанавливаем скорость патрулирования
|
||
|
||
// Если враг достиг точки патруля, выбираем следующую
|
||
if (!agent.pathPending && agent.remainingDistance < 0.5f)
|
||
{
|
||
currentPatrolIndex = (currentPatrolIndex + 1) % patrolPoints.Length;
|
||
agent.SetDestination(patrolPoints[currentPatrolIndex].position);
|
||
}
|
||
}
|
||
|
||
void ChasePlayer()
|
||
{
|
||
agent.speed = chaseSpeed; // Устанавливаем скорость преследования
|
||
agent.SetDestination(player.position); // Идём к игроку
|
||
}
|
||
|
||
void KillPlayer()
|
||
{
|
||
agent.SetDestination(transform.position); // Останавливаем движение
|
||
|
||
// Немедленная смерть игрока
|
||
Debug.Log("Игрок убит!");
|
||
// Перезапускаем сцену (или можно вызвать другое действие, например, показать экран смерти)
|
||
GameUIManager uiManager = FindObjectOfType<GameUIManager>();
|
||
if (uiManager != null)
|
||
{
|
||
uiManager.ShowDeathScreen();
|
||
}
|
||
else
|
||
{
|
||
Debug.LogError("GameUIManager не найден в сцене!");
|
||
}
|
||
}
|
||
|
||
/*
|
||
void UpdateAnimations()
|
||
{
|
||
// Предполагается, что в Animator есть параметры "IsWalking" и "IsAttacking"
|
||
animator.SetBool("IsWalking", currentState == EnemyState.Patrol || currentState == EnemyState.Chase);
|
||
animator.SetBool("IsAttacking", currentState == EnemyState.Attack);
|
||
}
|
||
*/
|
||
// Визуализация радиусов в редакторе (для удобства настройки)
|
||
void OnDrawGizmosSelected()
|
||
{
|
||
// Радиус обнаружения
|
||
Gizmos.color = Color.yellow;
|
||
Gizmos.DrawWireSphere(transform.position, detectionRange);
|
||
|
||
// Радиус атаки
|
||
Gizmos.color = Color.red;
|
||
Gizmos.DrawWireSphere(transform.position, attackRange);
|
||
}
|
||
} |