5 полезных приемов при проектировании искусственного интеллекта

Полезно наблюдать за внутриигровой визуализацией, особенно если ты сам ее и создал! Однако, в погоне за этим ярким впечатлением легко забыть, что не нужно визуализировать все подряд.
Ниже вы найдете видео туториал по визуализации геймплея и ИИ, записанный в секретной исследовательской лаборатории AiGameDev.

Зачем нужна (хорошая) визуализация?

Корректность — При имплементации фич, даже если используются юнит-тесты, важно иметь визуализации, чтобы быть уверенным в правильном понимании проблемы. Комплексные игровые миры могут иметь особые кейсы, которые не учтены юнит-тестами.
Выявление багов — Помимо, собственно, проверки работоспособности кода, визуализация помогает избавиться от многих проблем при изоляции бага. При наличии коллекции визуализаций легче выявить баг или понять «где собака зарылась».
Оптимизация и настройка — На завершающей стадии проекта при наличии визуализаций легче вносить изменения в игровые уровни, поведения персонажей и геймплей.

Ниже представлены пять визуализаций, которые нами были использованы при разработке прототипа игры «RUSHING BASES». Обратите внимание насколько сильно эти инструменты помогли нам как на начальной стадии проекта, при построении инфраструктуры, так и в конце, для оптимизации игрового баланса.

Example #1 — Grid Map

Что она показывает?
Это демо сделано на базе двумерной сетки. Карта показывает какие зоны игрового мира доступны, а какие нет. По умолчанию заблокированные ячейки помечены пурпурным, а доступные не помечены вовсе.

Как это работает?
Это просто одна большая текстура с размерами сетки, которая (текстура? — прим. перев.) растянута на отлаживаемый полигон. Чтобы исключить перекрытие, было использовано смещение по вертикали, при этом можно установить тестовую глубину, добившись видимости текстуры повсюду на картинке.

Зачем это нужно?
Помогает понять начто влияет разрешение сетки.
Позволяет обнаружить узкие места на карте и помогает при проектировании уровней.

Example #2 — Area Network

Что она показывает?
Фундаментальное представление игры основано на группах ячеек, которые (группы ячеек, прим. перев.) мы называем зонами. Ноги растут из основ поиска пути и карт влияния. Сеть зон показывает не только сами зоны в отдельности, но и их связь друг с другом.

Как это работает?
Создается один экземпляр окружности, которая затем рисуется по центрам каждой из групп ячеек (зон). Окружность масштабируется и получает уникальный цвет в зависимости от размера и идентификатора зоны. Соединения между зонами рисуются сплайнами, хотя раньше я использовал стрелки — они менее тяжелы для рендеринга, но труднее визуализируются. Метки зон являются текстурами, отрисованными графическим движком и помещенными на карту мира с вертикальным смещением.

Зачем это нужно?
Помогает получить компромисс между точностью карты и ее простотой.
Визуализация графа, используемого алгоритмами поиска путей и построения карт влияния.
А еще эту штуку можно с важным видом демонстрировать кастомеру и прочему люду, проникшему в офис «внезапно» [*censored*] (смайлы под запретом, прим. перев.)

Example #3 — Hierarchical Graph

Что он показывает?
Это высокоуровневый граф поиска, который используется алгоритмом иерархического поиска путей. Он вычислен на основе зон, но имеет особую структуру, показанную на изображениях выше. Показаны только ребра графа, но узлы можно заметить.

Как это работает?
Граф нарисован в виде набора ребер. Каждое ребро отрисовано в виде тонкого полигона, т.к. не все графические драйвера позволяют рисовать линии. Каждый узел имеет метку, отрисованную в виде спрайта (прямоугольники, всегда повернутые к камере — есть спрайты, прим. перев.).

Зачем это нужно?
Помогает локализовать проблемы поиска путей, если они есть.
Позволяет увидеть все возможные варианты путей, которые могут быть использованы ИИ.
Показывает «потерянные» пути и другие возможные проблемы дизайна уровней.

Example #4 — Influence Map

Что он показывает?
Эта визуализация отображает «карту влияния», т.е. стоимость (важность?, значимость? — прим. перев.) каждой из зон для персонажа в текущей игровой ситуации. Часть зон, в зависимости от близости персонажей оппозиции, помечена красным или желтым — это зоны риска. Другие зоны, выгодные, помечены синим или бирюзовым вследствие осуществленных ранее успешных проходов. Картинки выше показывают оба этих фактора по отдельности и в комбинации в одной и той же зоне меток «успеха» и «риска».

Как это работает?
Реализовано это также, как и в случае с картой-гридом, через наложение текстур с той лишь разницей, что оверлейные текстуры должны обновляться вместе с обновлением карты влияния.

Зачем это нужно?
Помогает осмыслить тактические решения, сделанные ИИ.
Предоставляет дизайнеру обратную связь для балансировки и подстройки принимаемых ИИ решений.
Отображает долгосрочную статистику уровня, что также помогает в балансировке.

Example #5 — Navigation Paths

Что он показывает?
Эта визуализация отображает финальный навигационный путь, пройденный во время игры всеми акторами в игровом мире. Он представлен в виде последовательности стрелок, соединенных между собой. Каждая стрелка — сегмент пройденного пути. Также есть возможно показа истории ранее пройденных путей.

Как это работает?
Стрелки также рисуются с помощью узких полигонов. Разница в том, что полигоны должны обновляться при каждом изменении навигации. Реализованы некоторые оптимизации для уменьшения необходимых вычислений при динамическом обновлении навигации.

Зачем это нужно?
Отображает корректность пути на низком уровне. Позволяет обнаруживать баги поиска пути.
Отображает решения поиска пути, принятые ИИ обеих команд.
Позволяет вникнуть в суть высокоуровневого поведения, также полезно при оптимизации и улучшении дизайна уровней.
Предоставляет возможность визуализовать эволюцию такических решений в поиске путей.

Заключение
В нашем случае описанные выше приемы визуализации навигации подошли как нельзя лучше, т.к. главная задача игры — тактический поиск пути в мире с препятствиями. Эти приемы принесли много выгоды как в низкоуровневом кодинге, так и в высокоуровневом дизайне уровней и поведения, а также в разных улучшениях и оптимизациях.
Вообще, очень выгодно иметь такие визуализации и для многих других применений. Чем больше времени вы посвящаете реализации кода, тем больше времени уйдет на создание визуальных представлений реализованных сущностей. Вы потом скажете себе спасибо за созданные инструменты визуализации!