Так же важно, что если цель покинет поле зрения, то герой останется на ней сфокусирован, пока её дистанция не увеличиться больше допустимой, в этом случае он опять будет переключаться на ближайшую цель в поле зрения. Так же нужно учесть, что пока здесь не реализовано поведение, которое учитывает урон от ближайших целей (о чем мы поговорим в следующих частях цикла).
Lead Unity Developer
if (!Physics.Raycast(transform.position, directionToTarget, distanceToTarget,
_obstructionMask))
{
isSeeTarget = true;
}
else
isSeeTarget = false;
Ну серьезно?
isSeeTarget = !Physics.Raycast(transform.position, directionToTarget, distanceToTarget, _obstructionMask) же.
Там еще флаги изначально стояли, я их вырезал и забыл поменять
Интерфейс IFOV выполняет несколько задач. Там пробел в одну строку как раз там где следует его порезать на два разных интерфейса. Тот что является Fov реализацией и тот что отвечает за поиск целей в реализаций.
Есть версия overlap sphere non alloc. Текущаягенерит каждый раз новый лист, даже если он ре нужен. Еще, не уверен до конца, но вроде бы вызов этих методов следует в FixedUpdate засунуть, но это не точно.
IsSeeTarget просто не нужен - добавляй в список и все. Код чище будет.
Не нравится проверка на попадание в угол зрения - normalized - высчитывает корень квадратный, лучше бы этого избежать.
GetNearestTarget делает расчеты при каждом вызове. Следует хранить таргеты в отсортированном по дистанции виде и просто возвращать первый.
Со всем согласен, кроме GetNearestTarget. Позиция ближайшего может измениться на следующий вызов метода, так что его следует пересчитать. В целом это просто на понимание как это работает, код естественно написан за 5 минут без всякой оптимизации
Очень грубое решение задачи в лоб, но как пример для тех кто не делал ИИ никогда - сойдет. Такое можно использовать в первом приближении новичку понимая что это не оптимальный код и нужна оптимизация. Кстати делать какие либо проверки визуального контакта с игроком когда он на большем расстоянии чем может видеть ИИ не имеет смысла даже раз в минуту. В данном случае оверлап используется именно для определения того что игрок не спрятался и находится в поле зрения. Также скрипт который будут вешать на всех врагов должен использовать подсистему ИИ, которая и должна будет уже делать все самые сложные расчеты выбирая для них только те объекты которые могут встретится хотя бы теоретически. Но это уже способы оптимизации и они будут важны для конкретных случаев использования ИИ. Будем ждать продолжения. Спасибо за статью. Тем более тоже было желание подобное написать, но так и не определился для какой аудитории.
Рейкаст на проверку видимости кидается из пивота объекта, в данном случае из точки на земле (видно на скриншоте). Если персонаж будет стоять рядом с ящиком или забором, который ему по пояс, он "не увидит" врага, стоящего за ним, потому что рейкас из ног будет сразу упираться в препятствие.
Как вариант можно добавить чайлд-пустышку на уровне глаз персонажа и кидать рейкаст из него. При таком подходе пивот может быть где угодно и не повлияет на качество проверки рейкаста.
Вот почему все нужно дебажить, да.