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

132 lines
5.0 KiB
C#
Raw Permalink 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 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);
}
}