Войти
ПрограммированиеФорумИгровая логика и ИИ

Нужна помощь

#0
(Правка: 9:51) 9:23, 14 мая 2023

Мой ИИ ходит по точкам, и если игрок попадает в его зону видимости - он продалжает ходить по точкам.
Мне надо чтобы он ходил по точкам - заметил игрока - пошёл за ним. Если он теряет игрока - проверяет последнюю точку где был игрок - не найдя игрока - идёт патрулировать

Вот код:

using UnityEngine;
using UnityEngine.AI;

public class EnemyAI : MonoBehaviour
{
    [Range(0, 360)] public float ViewAngle = 90f;
    public float ViewDistance = 15f;
    public float DetectionDistance = 3f;
    public Transform EnemyEye;
    public Transform Target;

    private NavMeshAgent agent;
    private float rotationSpeed;
    private Transform agentTransform;

    // Массив положений точек назначения
    public Transform[] goals;
    // Расстояние на которое необходимо приблизиться к точке
    public float distanceToChangeGoal;
    // Номер текущей целевой точки
    int currentGoal = 0;

    private void Start()
    {

        agent = GetComponent<NavMeshAgent>();
        rotationSpeed = agent.angularSpeed;
        agentTransform = agent.transform;
        agent.destination = goals[0].position;
    }
    private void Update()
    {
        Potrul();
        float distanceToPlayer = Vector3.Distance(Target.transform.position, agent.transform.position);
        if (distanceToPlayer <= DetectionDistance || IsInView())
        {
            RotateToTarget();
            MoveToTarget();
        }
        DrawViewState();
    }

    private bool IsInView() // true если цель видна
    {
        float realAngle = Vector3.Angle(EnemyEye.forward, Target.position - EnemyEye.position);
        RaycastHit hit;
        if (Physics.Raycast(EnemyEye.transform.position, Target.position - EnemyEye.position, out hit, ViewDistance))
        {
            if (realAngle < ViewAngle / 2f && Vector3.Distance(EnemyEye.position, Target.position) <= ViewDistance && hit.transform == Target.transform)
            {
                return true;
            }
        }
        return false;

    }


    private void RotateToTarget() // поворачивает в стороно цели со скоростью rotationSpeed
    {
        Vector3 lookVector = Target.position - agentTransform.position;
        lookVector.y = 0;
        if (lookVector == Vector3.zero) return;
        agentTransform.rotation = Quaternion.RotateTowards
            (
                agentTransform.rotation,
                Quaternion.LookRotation(lookVector, Vector3.up),
                rotationSpeed * Time.deltaTime
            );

    }
    private void MoveToTarget() // устанвливает точку движения к цели
    {
        agent.SetDestination(Target.position);
    }


    private void DrawViewState()
    {
        Vector3 left = EnemyEye.position + Quaternion.Euler(new Vector3(0, ViewAngle / 2f, 0)) * (EnemyEye.forward * ViewDistance);
        Vector3 right = EnemyEye.position + Quaternion.Euler(-new Vector3(0, ViewAngle / 2f, 0)) * (EnemyEye.forward * ViewDistance);
        Debug.DrawLine(EnemyEye.position, left, Color.yellow);
        Debug.DrawLine(EnemyEye.position, right, Color.yellow);
    }

    public void Potrul()
    {
        // Проверка на то, достаточно ли близок агент к цели
        if (agent.remainingDistance < distanceToChangeGoal)
        {
            // Смена точки на следующую
            currentGoal++;
            if (currentGoal == goals.Length) currentGoal = 0;
            agent.destination = goals[currentGoal].position;


        }
    }
}

#1
10:09, 16 мая 2023

Надо пересчитать массив goals точками к цели и currentGoal = 0. Если игрока нет в поле видимости - аналогично идет пересчет goals.

#2
15:00, 16 мая 2023

начни с этого:

private void Update()
{     
  float distanceToPlayer = Vector3.Distance(Target.transform.position, agent.transform.position);
  if (distanceToPlayer <= DetectionDistance || IsInView())
  {
    RotateToTarget();
    MoveToTarget();
  }else{
    Potrul();
  }
  DrawViewState();
}
#3
1:04, 18 мая 2023

Код не смотрел, но с уверенностью посоветую:
Finite state machine или behavior tree. Почитай, пойми, втянись. Не обязательно прямо иметь какой-то инструмент с кнопочками и редакторами, но чтобы успешно писать ai нужно мыслить более высокоуровневыми конструкциями, чем функции и переменные

ПрограммированиеФорумИгровая логика и ИИ