Сейчас наша команда Candango Games работает над игрой для ПК в стиле хоррор. Мы планируем ее уже скоро представить (кстати, для ее создания я изучаю составные элементы страха). Так вот одна из самых главных возможностей, которую я хотел реализовать в этой игре – это система, обеспечивающая эффект полного присутствия. А, как мы знаем, самое главное для реализации этой задачи – это создание качественного ИИ.
Думая о том, как же это сделать, я понял, что для создания архитектуры ИИ подойдет эвристический подход. Ниже я подробнее расскажу об этом.
В некоторых теориях о Познании говорится, что мы не видим Реальность такой, какая она есть. Вместо нее мы видим Виртуализованную «копию» Реальности, которая создается и обрабатывается нашим
На первый взгляд это совпадает с тем, как мы подходим к реализации ИИ: мы программируем агентов на получение и обработку информации о мире для того, чтобы потом на основании этих данных принимать решение. Таким образом, мы переносим свое видение мира в искусственный интеллект – заставляем агентов действовать так же, как бы они действовали в
Однако конкретно в сфере видеоигр наблюдается одна деталь: там эквивалент «реального мира» уже виртуален, то есть это уже чистая информация. Зачем же ее повторно виртуализовывать в
Мы приняли решение идти в этом направлении, так как этот подход лучше подходил под наши цели – создать ИИ для хорошей Динамики игры. Представьте себе следующую последовательность геймплея:
За вами гонятся в каком-то доме. Когда вы бежите по коридору, вы замечаете открытую дверь, которая ведет в спальню. Вы вбегаете туда и запираете дверь. Преследователи начинают взламывать замок, и вы понимаете, что скоро они войдут в эту комнату. Оглядываясь вокруг, вы видите закрытое окно, кровать и шкаф. Вы открываете окно и прячетесь под кровать. Дверь открывается, один из преследователей заходит в комнату, подходит к открытому окну и выглядывает из него. Затем он кричит своим сообщникам, что вы убежали, выпрыгивает из окна и исчезает в темноте. На этот раз вам удалось спастись.
Вот что можно сделать с помощью простого кода, используя базовый эвристический подход «переноса
Теперь представьте следующие события:
Вы сидите за компьютером, создаете игру и вдруг оказываетесь на кухне перед открытым холодильником. Вы ищете там что-то или возвращаетесь обратно к компьютеру с чашкой кофе, хотя до этого никакого желания попить кофе вы не испытывали.
Как это случилось? Вы осознанно встали и сделали это? С чего вдруг вы это сделали?
Так и в этом случае: «умный» здесь не агент, а окно, а
Взаимодействуя с окном, игрок повышает его значимость, в связи с чем повышается приоритет этой задачи, и агент выбирает именно ее, а не другие варианты – это контролируется сценариями окна. А вот, например, если бы игрок прятался в шкафу и сидел там тихонько, то приоритет задачи «заглянуть в шкаф» автоматически снижается, и поэтому агент выберет вариант «посмотреть под кровать», а у игрока, опять же, появится возможность убежать. Все зависит от выбора гейм-дизайнера: именно он принимает решение, как должен работать каждый элемент.
Но не все задачи исходят от внешних источников. Внутренние или прикрепленные к агенту элементы также могут давать задачи. Например, если у агента есть аптечка, и вдруг его ранят, то аптечка (которая у него есть) прикажет агенту ее использовать. Значимость этой задачи будет прямо пропорциональна тяжести ранения. В то же время система повреждений агента (внутренняя) прикажет ему убежать от того, что наносит агенту ранения. Скорее всего, в этой ситуации агент, на основании значимости каждой из задач, убежит и найдет безопасное место, вылечит ранение и либо продолжит борьбу, либо убежит прочь. Это легко реализовать: просто нужно наделить аптечку знанием, что в текущей ситуации без лечения никаких действий не удастся предпринять, что прекращение лечения приведет к уязвимости агента. Таким образом выстраиваются приоритеты задач.
Это самые основы эвристического подхода, и мне действительно понравилось его использовать. Мы смогли сделать систему обеспечения эффекта полного присутствия, мы создали ее надежной, сложной, но в то же время и очень простой с точки зрения кода. К тому же, эта система достаточно универсальна, что позволяет легко изменять, модифицировать и добавлять задачи. Например, мы можем создать новый источник задач в виде автомобиля, замка или лестницы без изменений программы агента. Либо мы можем изменить или улучшить системы, которые контролируют только конкретное задание или часть
Затем я захотел добавить системы распознавания текста, чтобы посмотреть, как ее можно использовать в эвристическом подходе. Текстовая инструкция вроде «положите синий мяч в зеленую коробку», которую дали соответствующим неигровым персонажам, будет идентифицироваться, соответственно, зеленой коробкой и синим мячом, и они будут давать задачи агенту, чтобы тот взял мяч, понял, куда его положить. Тем самым создается впечатление, что агент понимает, что говорит ему делать игрок.
До этого момента все выглядело очень красиво. Затем фаза первоначального создания игр закончилась, и я столкнулся с тем, что эти задачи нужно было как-то реализовать в виде кода. Наступила фаза выполнения работ. На данный момент моя система выглядит примерно так:
Поведение – это взаимодействие агента с окружающей средой
Когда я стал программировать эту систему в Единообразие понятий, каждый день мне приходилось уделять какое-то время основам ИИ. Не только ИИ для видеоигр, но ИИ в целом. Я хотел просто убедиться, что не трачу понапрасну время, изобретая уже изобретенное колесо.
Я начал узнавать некоторые очень интересные концепции, а также старые исследования и эксперименты, некоторым из которых уже полвека. Среди них я могу назвать «Систему взглядов» в эксперименте Хайдера и Зиммель с анимацией (1944), «Науки об искусственном» Герберта Саймона (1969) с анекдотом «Муравей на пляже», а также Эксперимент Кулешова (оригинал датируется в районе 1919 года), который, как мне кажется, на тот момент не соответствовал времени. Со временем эта информация стала все больше захватывать меня и напрочь лишила меня сна.
В конце концов, я понял, что, начав с другого конца, к середине пути я подошел к этим знаниям. Я шел с немного другой перспективой: я хотел создать «умный» мир, ведь мне казалось, что это очень эффективно, так как мы виртуализируем мир, в котором живем, а агент живет в уже виртуальном мире. Но это была всего лишь база для того, чтобы сделать что-то намного более мощное и серьезное. Но тогда я не видел этих возможностей.
Все эти исследования сходятся в одном: простое в сочетании со сложным дает сложный результат, который наш
Конечно, мы в Game Design ставили цель, чтобы ИИ заставлял агентов казаться сложными и разумными, используя различные трюки. Но меня заинтересовал не этот базовый подход, а формула Простое vs Сложное, которая повторялась в каждом из этих экспериментов – это совпадало во всех исследованиях, вне зависимости от их специфики.
После того, как я заметил наличие этого аспекта во всех таких экспериментах и исследованиях, я стал искать аналогии в других сферах, потому что допускал, что этот аспект может присутствовать во многих ситуациях, просто я об этом не знал. Самое главное, я искал аналогии в пробелах в нашей системе ИИ. А потом я стал задавать много вопросов о проблемах проектирования и пытался найти на них ответ, используя ту же систему и формулу.
• Если задачи создаются в модульной системе и имеют доступ к информации агента для выстраивания приоритетов инструкций и задач, почему бы не увеличить количество такой информации и не сделать ее более подробной? Дайте ей персоналии, фон, настроение, чувства, социальную динамику, а затем создайте задачу проанализировать эту информацию вместо того, чтобы зацикливаться только на здоровье и инвентаре.
Поведение для создания персонажа, который родился в джунглях и знает, где найти воду и еду, и персонажей из города без таких знаний может быть всего лишь фоновой проверкой, проводимой источником задач, который посылает следующие задачи после нахождения воды и еды. Если персонаж отсюда – задачу следует дать, если не отсюда – задача не дается.
• Почему я учитываю только конкретную сторону мира и не учитываю абстрактные вещи, которые вроде бы есть, но мы не можем их увидеть? Такие вещи, как драма, неизвестность, комедия? Почему нужно создавать поведение, которое берет начало от вещей, а не от людей и идей? Почему бы не создавать задачи от группы вещей, от науки и сюжетных сцен?
Мы можем сделать динамические сюжетные сцены для того, чтобы оживить модели поведения. Сцены, которые доступны конкретным героям и появляются в зависимости от того, как соответствует роли каждый персонаж.
Ситуации могут быть запланированные, привязанные к месту или запускаемые в зависимости от ситуации и конкретной точки в развитии сюжета. Например, создать общую киносцену для зомби, где один из героев был укушен или ранен, а другие герои спорят о том, стоит ли ему помочь, оставить его или нужно просто его убить и дело с концом: ситуация не зависит от того, кого именно укусили или ранили. Источник задачи (сюжетная линия) просто оценивает, как вписывается в свою роль каждый персонаж и предлагает им различные задачи для каждой роли, в результате чего сюжет развивается естественно, на основе их решений. В противном случае мы бы могли иметь кульминационную ситуацию для любого из героев, наблюдали бы со стороны, как ведет себя игрок в ключевых ситуациях для того, чтобы изменить сюжет триллера.
• Почему бы не использовать эти динамические сюжетные линии и распространять их эффект на дальнейшие события с возможностью существенного изменения сюжета?
Если игрок рыскает повсюду и замечает шины на машине неигрового персонажа, ему не отобразится стандартная сюжетная сцена «Вечеринка». Вместо этого потом этот неигровой персонаж начнет танцевать с какими-то романтическими намерениями (потому что в сцене танцев он заменится другим неигровым персонажем из списка), и любовный треугольник поменяется на ситуацию между двумя героями с выяснением личностей, что приведет к каким-то еще необычным результатам.
Либо если персонаж, который берет на себя роль Лидера группы, потерявшейся в пустыне, начинает терять рассудок или впадает в отчаяние, абстрактную идею/социальную динамику «Лидерство группы» берет на себя неигровой персонаж и тем самым несет ответственность за свои решения. Аналогичным образом, если группа недовольна решениями лидера, социальная динамика этой ситуации может привести к появлению нового динамичного сюжета, где они сначала борются против системы, а затем распадаются на два лагеря.
• Но зачем тогда останавливаться на этом? Почему бы не позволить сюжетным линиям самостоятельно определять, какую роль выбирает игрок, а затем адаптировать ситуации под каждого игрока?
Сюжетом выбирается персонаж на роль второго лидера (либо она открыта какое-то время, чтобы определиться, подходит ли игрок на эту роль или нет), после чего остальные выражают свою поддержку какой-то стороне, а кто-то высказывает намерение прекратить боевые действия и объединиться.
• Но персонажи могут сражаться, даже убегая от зомби, или во время спора о том, кто же является лидером, или сообщество вообще может решить бросить раненого лидера. Поэтому почему бы не улучшить систему принятия решений и добавить персонажам возможность многозадачности?
Агенты имеют «психоресурсы», которые позволяют им выбирать несколько задач одновременно (и устанавливать приоритетность для этих решений на основании группировки задач, а не просто выполнять задачу одну за другой): концентрационные пределы, руки, ноги, рот, глаза…
Если поведение – это всегда взаимодействие агента и окружающей среды, то почему бы не распространить смысл этого термина на личность и настроение? Разве мы одинаково ведем себя дома, на работе, на различных мероприятиях, в обществе друзей и с незнакомыми людьми? Если где-то мы видим счастливых людей, мы сами разве не становимся хоть чуть-чуть счастливее? А если где-то все серьезные, мы ведь тоже становимся серьезнее? Разве это же неверно для других событий и ситуаций?
Текущая модель
После дальнейшего изучения многих вопросов и аспектов, без усложнения кода, но просто лучше изучив, что с эвристическим подходом создается ИИ, сохраняя все базовые системы нетронутыми, в конце концов мы пришли к выводу:
Все, что случается один раз, может больше никогда не произойти. Но все, что происходит дважды, обязательно произойдет и в третий раз». Схемы всегда можно расширить для создания новых задач
Вот так наша система выглядит сейчас, и с помощью этого и будет создаваться наша хоррор-игра, о которой я говорил в начале статьи. Эта игра не означает предел этой системы, так как система достаточно универсальна для того, чтобы ее развивать и дальше. Другое дело, что перед этим нам нужно изучить, как добиться более продвинутых задач с оптимальными затратами труда и времени.
Я еще много буду рассказывать в следующих статьях об этом проекте. Сейчас я сделать это не могу, так как пока нет достаточной информации.
Самое интересное всегда говорится в конце: после выпуска нашей игры, мы, скорее всего, выпустим ее бесплатную модель в Unity Asset Store, а также раскроем ее схемы для того, чтобы люди смогли ее сделать для других систем. Мы также будем регистрировать все то, что мы узнаем об условиях использования системы, обязательно зафиксируем советы и уловки для работы с ней, проверим, что работает, а что нет, а также приложим некоторые интересные варианты того, что можно делать с использованием этой системы.
Мы тоже хотим поиграть в ваши крутые игры с использованием этой системы! Мы хотим, чтобы развитие видеоигр шло своим чередом, и в конечном счете они бы пришли к тому, какими должны быть игры. Мы хотим ускорить эволюцию форм искусства и считаем, что ИИ будет следующим поворотным пунктом в этом отношении.
Спасибо, что читаете! Подписывайтесь на наш блог и мы ждем всех вас нас на бета-тестировании VirCities!
Автор: m14