Введение
Всем привет!!
Я собираюсь вам показать,как можно сочетать поведения Поиск Путей и Поле зрение,что бы создать врага с базовым AI.Они будут бродить вокруг уровня,и как только увидят вас,будут преследовать вас.Если они не видят вас достаточно времени,то они вернуться к гулянию по уровню.
Этот туториал для изометрии,но так же можно использовать и в ТДС(Шутер с Видом Сверху)
Создаем спрайты.
Нам нужны некоторые вещи,а именно:
* Спрайт врага.
* Спрайт Игрока
* Спрайт поиска путей.
* Спрайты окружающий средой (стены, пол, дверь)
* Спрайт Помощника поиска путей,что бы избавиться от проблемы с передвижением врага.
* 2 значка состояние.1 что бы показывать что противник видит игрока и еще чуть чуть и пойдет за ним,и 2 что бы показать,что враг увидел игрока и идет за ним.
Вы можете создавать их любым способом,и размером.Но я сделал шахту в встроенном редакторе.Ниже приведены примеры моей окружающей среды.
Я придерживаюсь сетке 32x32 для этого примера.
Слева направо: пол,пространство внутри стен,стеновые панели,двери.
В использовании:
Значки состояния я сделал очень просто:
Для игрока и врага я использовал размер 24x48(я положил его с плиткой на полу,что бы дать представление о том,насколько спрайт должен быть большим)
Итак,теперь врагу нужно поставить Image Point для закрепления значков состояния и прямой видимости,Origin должна быть установлена где то на 2/3 ниже (у меня на y=32).Это исправляет один неприятный баг. alertPoint и losPoint нужны для того,что бы закрепить значки состояния.eyes нужна что бы показывать прямую видимость врага,я поставил его как можно ближе к глазам(типа как в реальной жизни.)
Для прямой видимости врага все очень просто,создаем спрайт с размером 1x1,так как мы будем растягивать его от врага к игроку,и ставим ему точку Origin на левый нижний угол (обязательно).
Не забываем давать нашим спрайтам имя,так как это очень помогает в исправлении ошибок.
Время двигаться.
И так,мы создали спрайты,они выглядят хорошо,но они ничего не делает,время это исправить!
Игрок
Первое,даем ему поведение 8 сторон (8 Direction).И ставим настройки как на картинке:
Далее добавляем нашим стенкам и двери поведение Solid (твердый),это чисто для того,что бы сделать эти объекты непроходимым игроку,враги же будут искать путь и обходить все препятствия.
Если вы сейчас запустите макет,то вы можете спокойно ходить по уровню,но через двери вы пройти не сможете,поэтому исправим сейчас!
Переходим в события и делаем такую штуку:
Если игрок коснулся Двери > Сломать дверь
Ура,теперь когда игрок коснется двери она исчезнет,а игрок может проходить дальше.
Враг
На этом этапе уже становится сложнее.
Даем спрайту поведение поиск путей(Pathfinding)и ставим такие настройки:
После того,как вы сделали это,нужно добавить 3 контейнера.
С помощью этого набора,мы будем иметь дело с блуждающим противником.На самом деле это сделать очень просто,это включает себе поведение поиска путей,мы будем выбирать случайную точку на макете,и если он может дойти туда,то он идет,а если нет то он будет выбирать новую случайную точку.Но это типа то,что мы будем делать дальше.А теперь создаем 3 переменные у врага(объясню попозже)
Вернемся в события,и создадим следующее:
Это говорит о том,где враг не может ходить,через стены и двери.
Эти же события делают противника блуждающим,выбираем случайную точку на уровне,и если он может дойти,то идет,а если нет то выбирает другую.
Теперь если запустить макет то противник будет блуждать по уровня обходя препятствия и игнорируя игрока,но враг не может проходить в недавно открытые комнаты(когда игрок открыл двери).Это происходит потому что,враг должен восстановить свою карту препятствий.И это очень легко сделать:
Теперь когда вы откроете двери,то враги смогут двигаться туда.
Это является не обязательным,но я бы рекомендовал принцип решение проблемы срезание углов врагов.Благодаря использованию невидимых вспомогательных спрайтов,вы можете спокойно конкретные маршруты,это надо,что бы они не нализали друг на друга.
В моем исходники они показывают зеленым цветом,и могут быть включены отключены на кнопку "Р"
Поле Зрения
Основы
Для поле зрения мы будем растягивать спрайт к точке X врага и Y врага к X игроку и Y
игроку,когда этот спрайт не сталкивается с какой-либо окружающей средой,а затем Поле Зрение найдет игрока,то он будет преследовать врага,когда враг теряет игрока из поле видимости,то запуститься перезарядка,и как только это время прошло,то он прекратит преследовать и пойдет блуждать по уровню.Перезарядку я делал за тем,что бы он слажу не пошел блуждать как только потеряет игрока.
Давайте сделаем это! Для первой секции (настройка линии визирования спрайта) создают следующие события:
Первое событие удалит самый первый спрайт прямой видимости,но программа требует как минимум одну такую штуку,поэтому нужен хотябы один спрайт.
Потрясающее!Теперь у нас есть прямая линия, прикрепленная к нашему врагу и он показывает прямую линию между нашим врагом и игроком
Настройка состояний.
Далее мы должны выполнить,что будет если враг не получил прямой видимости к игроку.
В этом евенте,если спрайт поле зрения врага перекрыто(стоит препятствие),затем поле зрение врага устанавливается на ложь,после того как спрайт поле зрения врага не перекрыто,то поле зрение врага устанавливается на истину,а перезарядка устанавливается на 5.
Для чисты,добавим 2 "враг будет предупрежден каждую секунду" в события.
С этим все,конец,когда вы запустите ваш макет,ваши враги будут преследовать врага если видят вас,и если не видят вас в течении 5 секунд продолжат блуждать по уровню.
Значение состояния.
И наконец,мы можем создать значки состояние,которые показывают нам состояние противника в данные момент:
Это позволит динамически показать / скрыть значки в зависимости от того, что логическое значение состояния противник находится в:
Этого врага одновременно насторожило и он имеет прямую видимость.
Вот враг предупрежден,но он не видит нас.
Мысли.
Надеюсь мой туториал кому нибудь пригодиться,ведь я угробил на него несколько дней,что бы все работало идеально.С логическими состояниями, вы можете легко сделать атаки противника, когда он имеет прямой видимости.
Если чего то не понятно,то пишите в комментарии или в личные сообщение.
.png]