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(); // animator = GetComponent(); 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(); 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); } }