Выбор игрового ИИ и его “сложность”
Наконец-то вернулся в строй и начал делать второе видео по шине событий, а вместе с ним и статью в продолжение первой! Но поговорить хотел не об этом.
Вчера блуждал по интернетам — смотрел на различные туториалы по игровым ИИ и их реализации. Сразу признаюсь, что целиком их не просматривал, поэтому если и где-то существует похожий контент, то не брезгуйте тыкнуть меня в него носом.
Вчера блуждал по интернетам — смотрел на различные туториалы по игровым ИИ и их реализации. Сразу признаюсь, что целиком их не просматривал, поэтому если и где-то существует похожий контент, то не брезгуйте тыкнуть меня в него носом в комментариях на моем канале.
Многие из вас наверняка знакомы со всеми подходами, но давайте начнем с небольшого глоссария, чтобы дальнейшие сокращения не вызвали ни у кого сложностей:
FSM — finite state machine или машина конечных состояний. Слово «конечные» как правило опускается
BT — behavior tree или дерево поведений. По своей сути «апгрейд» машины состояний
GOAP — goal oriented action planning. Про него расскажу ниже
Итак, интернет полон туторами по ИИ во всех возможных вариантах: машина состояний, дерево поведений, GOAP и utility AI. Каждое из которых со своей сути лишь определяет алгоритм, по которому сменяются состояния/действия персонажа.
Для FSM и BT это простые if else с четкими условиями перехода. «Если видим противника, идем к нему. Если подошли, атакуем».
Для GOAP мы находим такой «путь» из действий игрока, который приводит к желаемому результату. Как правило, для выбора «пути» используем поиск в ширину, но при большом количестве действий можно рассмотреть варианты использования алгоритмов-«старших братьев» поиска в ширину. Например, A*.
В Utility AI мы просто выбираем самое «эффективное» действие каким бы то ни было способом. Это можно делать за счет формул расчета, оценки через кривые Безье или через смесь этих способов.
Также существуют различные смешанные способы, но по факту они заканчиваются одним из этих четырех подходов. Например, так называемый tactical AI — по факту он одним из вышеуказанных способов выбирает не конкретное действие, а их последовательность. Но лично я не вижу здесь никакого принципиально нового подхода в сравнении с остальными.
Также нельзя не затронуть вопрос реализации ИИ с помощью машинного обучения. В них есть также три основных проблемы относительно более «классических» подходов.
Трудозатраты — потребуются долгие сотни и тысячи часов чтобы обучить такой ИИ даже двигаться в нужную сторону. Даже при ускоренных симуляциях и многих обучаемых агентах одновременно. Ведь ему нельзя напрямую говорить «иди туда», надо давать «награды», если он идет куда следует. Правильная и сбалансированная выдача которых тоже довольно не тривиальная задача для всего что сложнее «змейки» или Flappy Bird. Что уже и говорить про интеллект для пошаговых тактик по типу XCOM, стратегий по типу Civilization или Crusaders Kings или про шутеры с хорошим ИИ по типу Killzone или FEAR (могли бы быть другие примеры, но я просто выбрал любимые игры. Напишите в комментарии свои любимые игры или игры с хорошим на ваш взгляд ИИ).
Качество — даже при хорошем обучении, очень невелик шанс, что ИИ будет себя гарантированно «правильно» вести. Особенно, в очень сложной и динамической среде. Игроки и разработчики предпочтут «предсказуемый» интеллект «умному». ИИ, построенный с помощью машинного обучения будет всегда по своему интерпретировать входные условия и действовать в соответствии с тем, чему научился. Отсюда вытекает и третья проблема…
Сложность в редактировании. Даже используя более продвинутые подходы, очень легко менять поведение персонажей — подкрутить кривую Безье в одном месте или отредактировать эффекты от действий и цели ИИ в другом. Но это не получится сделать так быстро с ML. Если вы, например, научили ботов в шутере атаковать как берсерков, не смотря на ранения, то сделать их более осторожными займет большое количество времени и итераций. Вспомните youtube с его жуткими алгоритмами — если вы посмотрели какой-то ролик на совершенно новую тему (например, музыкальное видео, хотя все остальное время смотрите подкасты и видео о программировании). То как долго вам придется игнорировать новые музыкальные видео, чтобы youtube наконец-то решил «ладно, видимо ему это и правда не нравится». Повезет, если при этом он хотя бы не будет показывать тот единственный просмотренный ролик!
Поэтому реализации на самом деле «сложного» ИИ задача гораздо более объемная и невыгодная в сравнении с базовыми реализациями.
Во многих источниках выбор между подходом рисуют в виде прямой, над которой написаны все варианты в порядке «усложнения». Вроде такого FSM → BT → Utility AI → GOAP. Но такой подход в корне не верен, так как не совсем понятно, что в таком случае есть «усложнение». Ни один их этих подходов не является «сложным» в реализации. Но о том, в чем может заключаться сложность подхода поговорим немного позже.
В общем и целом, при выборе подхода надо ориентироваться на несколько составляющих:
Количество действий/состояний персонажа (ходить, спать, стрелять и тд). Причем не только планируемых в ближайшую версию/спринт, а и планируемых в будущем. Чтобы не остаться со стейт машиной, в которой нужно проводить сотни стрелочек между действиями и помоги боже, если забудете хоть одну!
Предсказуемость. Легко понять как будет вести себя персонаж, если у него черным по белому будет написано «если устал — иди спать». Гораздо сложнее при этом смотреть на какие-нибудь формулы и анимационные кривые, которыми может выражаться «эффективность» для того чтобы «пойти поспать». Если хотите меньше сюрпризов в его поведении, то смотрите в сторону FSM и BT. Если больше уникальности — GOAP и Utility AI.
Горизонт планирования действий персонажа. Тут тоже все просто — при необходимости составления «стратегии» из действий двигаемся в сторону подходов, позволяющих это.
Теперь поговорим о «сложности» ИИ. До сих пор самым «сложным» игровым ИИ считается тот, который реализован в оригинальном F.E. A.R, выпущенном аж в 2005 году! Но сложность того ИИ заключалась не только в «поиске набора действий», а в реализации дополнительных «фичей» поверх. Помимо них есть существуют еще обвесы для ИИ, такие как:
Предсказание поведения игрока: «подожду игрока на левой дорожке, так как скорее всего он пойдет туда»
Групповое поведение: «предупредим остальных, если игрок пойдет по левой дорожке»
Динамически изменяемое поведение: «какие бы планы у нас ни были, если игрок пойдет по правой дорожке — побежим туда»
Самое интересное, что реализуются эти механики практически одинаково вне зависимости от подхода к реализации ИИ. Поэтому визуально составление игрового ИИ можно нарисовать в виде такой картинки:
При условии, что элементы пазла нельзя вращать, конечно же)
Поэтому в следующий раз, когда возьметесь за написании игрового ИИ, не будьте узколобым сторонником «легких» и «сложных» подходов — выбирайте с умом!
А теперь, когда мы немножко поговорили про матчасть игрового ИИ, по всем инфоцыганским законам сделаю небольшой прогрев)
Вот что оказалось самым забавным в моем поиске — это что ни один из туториалов не предлагает такую реализацию ИИ — реально «сложную» реализацию. Оно и понятно, игроки стали казуальными, даже в ААА. С каждой новой игрой от ubisoft, ютуб заполняется роликами, насколько же тупые у них боты. Поэтому в качестве серии роликов «для продвинутых» хочу сделать видео про написание не просто «ИИ написанный с помощью Х», а сделать серию роликов про по настоящему «сложный ИИ», который будет уметь делать все перечисленное и не только.
Поддержите, если нравится идея или напишите что об этом думаете в комментариях на моем канале (я еще не настолько выжил из ума, чтобы читать их здесь!) Или предложите на каком игровом примере на это было бы интереснее всего посмотреть. Я пока что думаю о top down shooter, чтобы и пострелять можно было, но и чтобы при этом было видно издалека, как ведут себя боты.
BTW, новые ролики будут на все том же канале, где и все остальные!