Погони, убийства и влюблённые парочки в Париже.
В 2015 году геймдизайнер Ubisoft Кристин Блондо (Christine Blondeau) объяснила на конференции GDC, как разрабатывались систематические игровые ивенты Assassin’s Creed Unity, не зависящие от игрока, но дающие ему случайные возможности.
DTF публикует пересказ выступления.
Концепция
Поскольку Assassin’s Creed: Unity разрабатывалась для следующего поколения консолей, её создателям нужно было думать, как реализовать поведение толп NPC на новом «железе».
Разработчики вдохновлялись тем, что происходило на улицах Парижа во время французской революции. Исследовав документы прошлого, они выяснили, что в этот период в столице Франции было много людей. Нужно было вызвать у игрока ощущение, будто город живет сам по себе.
Также требовалось запрограммировать ИИ так, чтобы поведение толпы было похоже на реальное; следовало генерировать случайные ситуации, в которых мог бы участвовать игрок — как в миссиях, так и в свободной игре.
Париж должен был вести самостоятельную жизнь, в которую игрок мог бы включаться (но не был бы обязан это делать). нужно было наделить NPC моделями поведения и социальными взаимодействиями.
Обычно события толпы подчиняются вручную созданным скриптам, писать которые долго и сложно, тем более в таком большом городе, как Париж. Разработчикам Unity просто не хватило бы на них времени, к тому же они хотели создавать непредсказуемые события на лету.
Человеческий фактор
Экосистема NPC в игре состоит из четырёх фракций: «экстремисты», «защитники», «стражники» и «горожане». У каждой есть свой набор поведенческих паттернов и реакций. Также они знают о существовании друг друга и Арно, главного героя игры, и могут взаимодействовать с ним и другими фракциями, когда им это интересно.
Каждая фракция может становиться инициатором события, занимая роль либо охотника, либо жертвы.
Защитники — это вооружённые горожане, сражающиеся, чтобы защитить простых людей от экстремистов и стражников. Если они увидят, что Арно в беде, они помогут ему. А если на защитников нападут, игрок сможет их спасти.
Экстремисты — это жестокие бандиты, сражающиеся на обеих сторонах революционного движения. Они будут атаковать любого, кто им не понравится, особенно вооружённых горожан (в том числе и Арно). В событиях они обычно играют роль врагов, которых пользователь может убить.
Увидев защитников, экстремисты постараются начать драку, то же самое касается и Арно. Если экстремистов атакуют стражники или защитники, они будут отбиваться. Если у стражников будет численное преимущество, экстремисты просто убегут.
Игрок, который не хочет сражаться с экстремистами, может избегать их или скрываться в толпе.
Вот случайное событие. Игрок просто идёт по улице, видит, как начинается перестрелка — столкновение экстремистов и защитников. Подобные ситуации случайно возникают во всём городе.
Стража выполняет функцию полиции — пытается поддерживать в городе закон и порядок. Она придерживается нейтральной позиции и преследует только тех, кто совершает преступления у неё на глазах. Участвуя в событии, стражники вынуждают игрока действовать скрытно, к тому же, их не нужно убивать для победы.
Если стражники увидят, как кто-то достаёт оружие, то предупредят его о последствиях. Через какое-то время они подойдут и заставят спрятать оружие — это касается не только Арно, но и любых NPC. Если стражники увидят драку, то присоединятся к ней и будут сражаться против зачинщиков. А обнаружив труп, постараются расследовать преступление и обвинят в убийстве тех, кто оказался рядом: Арно, защитников или экстремистов. Убегая от стражников, их можно заманить к защитникам, чтобы те помогли отбиться.
На видео видно, как стражники заставляют экстремиста перестать преследовать Арно.
Горожане — основное население игрового Парижа. Они могут собираться у точек интереса и формировать толпы, после чего такая толпа начинает искать себе занятие. Также горожане могут по-разному взаимодействовать друг с другом и окружением.
Горожане в курсе того, что происходит вокруг, и реагируют на случившееся. Для них создали три разных пакета реакций — фактически, эквиваленты личностных характеристик, — храбрецы, трусы и обычные. Если начинается схватка, обычные горожане могут заинтересоваться или уйти, храбрецы будут подначивать дерущихся, а трусы — убегут в страхе.
В событиях горожане могут становиться как жертвами, так и врагами, а игрок может спрятаться в толпе или воспользоваться ей, чтобы сбежать.
Игрок против экстремиста:
Игрок, экстремист и стражник:
Экстремист против защитника:
Экстремист, защитник и стражник:
Если экстремист видит слишком много оппонентов, он просто пройдет мимо:
А если превосходящие силы противника появятся в начале, экстремист просто убежит:
Группы и их функции
Алгоритмы «жизни» толпы создавали с помощью разных функций ИИ. Толпа была разбита на группы горожан с отличающимися функциями. Так, цель «ходоков» — просто бродить по улицам и взаимодействовать с окружением в определённых точках. Например, один из них может подойти к лавке, посмотреть на товары с заинтересованным видом, а потом уйти. На поток людей могут влиять дизайнеры уровней, уменьшая или увеличивая плотность ходоков на улицах.
Ещё одна группа — это «носильщики» — название говорит само за себя. В AC:U их возможности расширились — например, они могут носить других людей.
«Станции толпы» используются на улице и внутри зданий для создания бытовых ситуаций, при этом уникальных вариантов развития событий около 500. Станции располагались вручную дизайнерами уровней, а на картинке выше представлены примеры.
Бывают и более сложные станции: с музыкантами, танцующими людьми и зеваками. В отличие от предыдущих игр серии, в Assassin’s Creed: Unity появилась возможность заходить в некоторые дома, и эти пространства тоже надо было населить NPC.
К тому же, в игре появились массивные толпы людей из тысяч взаимодействующих друг с другом NPC. Благодаря новым технологиям, у разработчиков получилось сделать так, чтобы детализация NPC менялась в зависимости от расстояния до игрока.
Также создатели игры добавили спонтанные взаимодействия между жителями. Например, двое знакомых могут столкнуться и завести разговор или начать спорить. Влюблённые встречаются, берутся за руки и уходят.
Это своего рода тренировочное поле, на котором разработчики оттачивают взаимодействия между NPC.
События в толпе
Случайные события должны были демонстрировать реалии жизни в Париже времён революции. Они возникают случайно, и, при определённых обстоятельствах, игрок может сильно осложнить себе жизнь, например, если во время убийства его застанут стражники. Сценарии событий взаимодействовали с четырьмя группами навыков: бой, навигация, скрытность и манипуляция толпой.
Всего система поддерживает семь моделей, у каждой из которых есть несколько вариаций, так что можно менять участников события, их количество и роли.
Одно из двух событий, связанных с навигацией, — это поимка вора. Как и в других играх серии, вор крадёт что-нибудь у NPC и убегает, а игрок должен догнать его, чтобы завершить событие.
Второе связанное с навигацией событие — поимка и убийство преступника. От события с вором оно отличается только тем, что в конце негодяя нужно убить.
Итак, пользователь видит, что один горожанин убивает другого и убегает. Ему нужно догнать его и отомстить за жертву. Для этого надо хорошо ориентироваться в окружении, к тому же убивать перед стражниками опасно.
Теперь о событиях, проверяющих боевые навыки игрока — кстати, каждое из них можно разрешить и скрытно.
Например, два экстремиста убивают горожанина. Предотвратить убийство невозможно, но игрок может сразиться с ними, чтобы отомстить.
Также в игровом Париже случаются казни: экстремисты показательно убивают мирных горожан. В этом случае игрок может предотвратить преступление и убить экстремистов до того, как они расправятся с горожанами.
Ещё игрок может защищать горожан, которым угрожают экстремисты, и скрытно убивать гонцов с важными донесениями.
Игрок может отпугивать хулиганов, издевающихся над горожанами, при этом не убивая их, или давать деньги нищим.
Во время этих событий кто-то неизменно становится агрессором, а кто-то — жертвой. Это мгновенно влияет на экосистему. Например, стражники могут случайно оказаться рядом с событием по защите горожанина. В таком случае они остановятся, чтобы узнать, что происходит, и нападут на преступника, как только он убьёт жертву.
Проще говоря, игроку не обязательно участвовать в событиях: они могут разрешиться силами NPC.
Модульная система
Основная цель была — сделать так, чтобы для событий требовалось как можно меньше вмешательства дизайнеров уровней. Поэтому каждое событие «собирается» из логических блоков. К примеру, погоня в событиях «поймать вора» и «убить преступника» — это один и тот же элемент, а вот завершение у них разное. Потенциально можно создавать и более сложные события из большего количества блоков.
Эффективность такого подхода подтвердилась в конце разработки, когда создатели игры решили добавить в неё дополнительные события. Благодаря модульной системе, им удалось сделать это за считанные минуты.
Модули бывают трёх видов: вводный блок, блок с проблемой, блок с разрешением события. Во вводном блоке программа сканирует ситуацию вокруг игрока и просчитывает, какие события можно туда поместить. Когда выбор сделан, берутся «актёры» — либо из толпы, либо просто появляются на уровне. Они формируют сцену, и между ними происходит контакт.
Затем включается блок с проблемой: что-то происходит, и игрок может поучаствовать в событии. После чего в следующем блоке наступает развязка — событие разрешается силами либо игрока, либо NPC.
Хотя такой геймплей может выглядеть очень круто, дизайнерам миссий приходилось очень непросто. Какой бы детально проработанной ни была миссия, из ниоткуда могут появиться NPC и испортить нарратив.
Можно было бы просто отключить события, пока игрок проходит миссию — способ лёгкий, однако это противоречило видению разработчиков. Вместо этого они разработали специальные инструменты для управления толпой, чтобы вносить коррективы в её поведение, когда это необходимо.
В идеале все системы должны работать постоянно, однако в практике разработчиков AC:U встречались моменты, когда поведение толпы нужно было менять, исходя из нужд сюжета — иногда вплоть до полного отключения системы.
Для этого было создано два инструмента. С помощью «выключателя» можно было убирать из миссий все, либо некоторые события толпы, а «зона отключения» позволяла определять пространство, в котором они и не будут начинаться. Например, дворики или места, где находятся NPC, выдающие миссии.
Контроллер событий
Разработчики управляют событиями с помощью специальной программы, учитывающей множество параметров. «Контроллер» проверяет статус игрока и его прогресс, район города и время дня, он же занимается расстановкой «актёров», частотой и разнообразием событий, а также наградами за них.
Синим на этой картинке выделены NPC, которые могут стать потенциальными «актёрами» для события. Изначально концепция начала события выглядела так: контроллер находит NPC, заставляет их столкнуться на улице и взаимодействовать. Однако выяснилось, что брать уже имеющихся на уровне NPC сложнее, чем казалось поначалу.
В зависимости от события, система должна была находить до шести NPC из определённых фракций, стоящих неподалёку друг от друга, и направлять их так, чтобы сближение выглядело естественно. События с двумя участниками более-менее работали, но ограничений было так много, что разработчикам не удалось бы создать события с более чем тремя участниками.
Поэтому они решили оставить этот принцип для событий с двумя действующими лицами, а для более масштабных создавали отдельных NPC так, чтобы их анимации работали корректно, а весь процесс был незаметен для игрока.
«Призывать» NPC и так было необходимо, поскольку в некоторых событиях участвовали, например, горожане в кандалах. Было бы странно, если бы NPC из толпы внезапно встал на колени, а на его руках появились цепи.
Но придумать решения для того, чтобы игрок не заметил, как появляются NPC, всё равно пришлось. В основном появление скрывалось плотной толпой. Также возникла ещё одна проблема: для многих событий нужны были экстремисты и стражники, но если бесконтрольно добавлять их на улицы, баланс экосистемы пошатнётся. Поэтому масштабные события с большим количеством врагов происходят гораздо реже.
Ещё одной проблемой стали стартовые точки событий. Где начинать, и как научить систему понимать, где NPC должны появляться, а где нет?
На картинке выше изображено неправильное появление NPC: некоторые, как и должно быть, возникли на улице, но некоторые оказались внутри меша здания. С этой проблемой разработчики намучились — персонажи появлялись на столах, крышах, с половиной тела в стене и так далее.
К тому же, возникновению NPC мешали лестницы и склоны. Из-за них анимации выглядели неестественно.
Чтобы решить проблему, пришлось научить контроллер событий анализировать навигационный меш, который занимается поиском подходящих мест для NPC.
Так работает анализатор — игрок входит в кадр снизу, а программа ищет подходящее место для начала события:
Вот тот же самый процесс с точки зрения игрока. Анализатор сканирует окружение и в зависимости от условий активирует разные события, подбирая для них «актёров».
Очевидно, все эти системы доставляли неудобство разработчикам, когда они хотели что-то поменять, ведь это расшатывало сбалансированную экосистему игрового мира. Поэтому тонкая настройка началась уже на ранних этапах разработки.
Был создан специальный инструмент для генерации событий и дебаг-интерфейс, чтобы можно было видеть, работают ли системы так, как задумано.
У разработчиков был «чит», позволяющий активировать и деактивировать события — так у дизайнеров миссий появился инструмент, с помощью которого они могли влиять на экосистему. С помощью другого «чита» можно было создать на уровне представителя любой фракции — так стало легче тестировать появление разных NPC во время миссий.
Были «читы» и для частоты событий, а также особый дебаг-интерфейс, благодаря которому можно визуализировать стимулы, заставляющие NPC взаимодействовать. Например, если игрок достаёт оружие, а горожанин пугается, разработчик может узнать, почему он испугался, просто посмотрев на стимулы, инициировавшие реакцию. Также можно было визуализировать участников событий и причину возникновения событий или неудачной активации.
Поначалу разработчики тестировали события в контролируемой среде, чтобы отсеять самые крупные ошибки ИИ. Затем, как только какая-нибудь система была готова, её осторожно помещали в игровой Париж, тестируя с помощью «читов». Так разработчики сэкономили на продакшене, поскольку впоследствии на отлов ошибок пришлось потратить гораздо меньше времени.
Кристин считает важным, что она и члены команды часто сами проходили миссии с включёнными инструментами визуализации и дебаг-интерфейсами, постоянно обсуждая проблемы и удачные решения.
Система эта, тем не менее, далеко не идеальная. Для начала Кристин хотела бы разнообразить события, поскольку в итоге больше всего ситуаций было связано с боем — их попросту было проще делать. Например, события, бросающие вызов навигационным навыкам игрока, были очень ограничены: вор не может забежать в плотную толпу, залезть на крышу, переплыть реку и так далее.
Блондо считает нужным улучшить интеграцию событий в игровой мир на начальном этапе — так они бы выглядели гораздо более естественно и случались бы ближе к игроку. Например, после того, как один из уличных музыкантов передавал бы шляпу за подаянием, кто-нибудь из зевак мог взять её, ткнуть музыканта ножом и убежать, а у игрока появилась бы возможность разобраться с вором.
К тому же Кристин жалеет, что в игру не вошли более интересные события, для которых уже даже были записаны анимации — игровые системы с ними просто не справлялись. Тем не менее, в своем итоговом виде система событий в толпе иногда генерировала интересные и неожиданные события.
Разработчики могли бы добавить больше возможностей и меньше контролировать экосистему, но тогда мир игры выглядел бы совсем иначе, и, вероятно, не соответствовал бы заявленным целям.
Источник: DTF