Как сделать аналог Radiant AI(BGS) для создания "живого мира"

По просьбам переношу в gamedev

Это только кажется что ИИ имитирующий сложные действия делать сложно. Как добавить НПС жизни как добавить им расписание? Как дать им возможность ходить по разным местам? На самом деле все очень просто.Что бы создать игру сравнимую с играми Bethesda не нужно много народу.

Для создания Oblivion понадобилась команда из 80 человек - для Skyrim - 90.

И сейчас я вам покажу принципы по которым работают шестеренки у НПС

(в игра TES, Fallout у BETHESDA)

Основа ИИ в Забвении

Как все знают - уAI NPC гемдизайнер/сценарист создает график таблицы в редакторе карт:

указание идет через указание ID локации.
указание идет через указание ID локации.
Как сделать аналог Radiant AI(BGS) для создания "живого мира"

В рамках активности задавалась тип дейвствий:

Список на самом деле не очень большой
Список на самом деле не очень большой

В нем указано время с расписанием на день, неделю или месяц (потом повторяется) и ...именная локация и собственно набор активностей, которые НПС может на нужно локации делать

Уже чуете подвох? Нет?

Что же не буду тянуть кота за хвост и сразу раскрою секрет , что Лучистый ИИ работает на самом деле отнюдь не с NPC, а с понятием локации.

Как сделать аналог Radiant AI(BGS) для создания "живого мира"

И лишь у НПС которые рядом с героем с ними работает вполне локальный ИИ основанный на активностях. В этом и весь секрет.

Когда вы задаете график и список посещенных локаций у NPC - это одновременно приводит к записи в специальную таблицу ID у этой именную локацию, в виде таблице ID NPC и дат, когда они посетят локацию. А так же проверки - не заблокирован ли НПС по причине смерти или квеста.

И когда игрок заходит в локацию - движок игры проверяет жив ли NPC, сравнивает время - и заранее спавнит NPC с нужным ID в локацию, если он должен присутствовать там в момент прихода героя.
Если же время прибытия наступает когда игрок уже внутри - то игра спавнит NPC со стороны входа, после чего он на основе локального ИИ идет к месту своей активности.

Собственно и все. Можно закрывать конспект и идти реализовывать в своей игре.

В этом весь секрет лучистого ИИ (Radiant) от игр беседки. Я не шучу: тут ничего сложного.

***
Дальше дополнение с разными забавностями.

***

Небольшой совет по выставлению расписания:

Что бы NPC успевало добраться до следующей локации под пристальным взглядом игрока , нам нужно оставлять небольшие паузы в расписании между локациями, а NPC получая команду на простой: нужно активировали скрипт перемещения к следующей в расписании локации .

Зачем? Что бы упростить процесс разработки и выставления расписания.

Модификаторы активностей

Так же в рамках того же обливион у каждой задачи можно было настроить кучу флагов:

Они позволяют тонко настроить возможности NPC во время активности.

Рандомизатор в расписании.

Для удобства восприятия НПС- добавьте разброс по времени в расписание НПС что бы они начинали активность не одновременно, а с небольшим разбросом в 5-10-15 минут, возможно в зависимости от пунктуальности НПС

Что бы не было одновременного спавна NPC со стороны локации в одной точке.

(НПС в таверну)
(НПС в таверну)

CoolStory

Вы наверное спросите, а где истории про НПС с низкой социальной ответственностью убивающих за яблоко или наличие садового инвентаря?

А ИХ И НЕТ - это все байки от отдела маркетинга:

Not so Radiant AI examples Some of the unexpected behavior of NPCs that were discovered while testing the Radiant AI system were rather humorous. One character was given a rake and the goal "rake leaves"; another was given a broom and the goal "sweep paths," and this worked smoothly. Then they swapped the items, so that the raker was given a broom and the sweeper was given the rake. In the end, one of them killed the other so he could get the proper item. Another test had an on-duty NPC guard become hungry. The guard went into the forest to hunt for food. The other guards also left to arrest the truant guard, leaving the town unprotected. The villager NPCs then looted all of the shops, due to the lack of law enforcement.

Истории про Radiant AI

Сцена с E3 с "These NPCs are NOT scripted" с собакой и НПС была полным обманом. Все было на скриптах

Поэтому кратко поговорим про :

Локальные активности

Внутри локации NPC можно задать жесткую роль или мягкую.

При жесткой активости NPC будет заниматься только своей задачей, при мягкой - npc будет свободно ходить по локации и выбирать активности по своему характеру. Например активность можно задать в процентном соотношении.

Так то основные активности для персонажей :

Сон, Еда, Чтение, Торговля, Тренировка, Уборка, Копание грядок и т д....

Естественно приоритет активностей сбрасывается при переходе НПС с гражданского режима в боевое.

Вариации от Skyrim'a

В Skyrim систему несколько усложнили сделав возможность "делегации поведения" в случае смерти персонажа. Например случайной гибели в случае налета дракона.

(теперь это твоя работа)
(теперь это твоя работа)

Это позволяет игре сохранить для игрока места торговцев и квестодателей.

Забавный факт

Что бы игры Тодда нормально обрабатывали умерших именных НПС, - для них добавлена специальная локация с могилой (Dead Body Cleanup Cell).

18+
18+

Нахождение тел НПС в этой локации делает их недоступными для радиант АИ в большинстве квестов, кроме ... свадьбы. На которую NPC с меткой "друг" для героя явятся даже с того света. Этот костыль так же сделан для того что бы не выдавала ошибку - когда NPC удаляется из игры.

(золотой костыль)
(золотой костыль)

Хотя как по мне можно реализовать и не в виде локации - а банального списка мертвых.

Огороженные города

Движок бетезды отличается тем что все локации делятся на открытую карту мира и закрытую.

Как сделать аналог Radiant AI(BGS) для создания "живого мира"

Огораживание городов в Oblivion возникло не просто так как способ работать с локациями для NPC. Так как избыток НПС на открытой локации могло вещать ПК.
А NPC на глобальной карте перемещались более менее честно по дорогам, что позволяло встретить некоторых персонажей в роде М'аика

В качестве занятного костыля, после того как NPC покидает локацию на глазах у игрока - игра запоминает куда вела эта дверь и если игрок вышел с минимальной разницой по времени 30минут внутриигровых минут - то игрок сможет найти NPC за дверью.

На других движках, например Unreal аналог Radiant AI можно реализовать через Volumes Reference'ы, которые будут подгружаться с NPC по мере приближения к ним.
Нужно сначала сделать подходящий плагин который будет нормально записывать локаций, NPC и расписание.

***

Куда дальше развивать этот аналог глобального ИИ?

А теперь перейдем к моим вкусным предложениям:

Набор Ролей вместо уникальной настройки отдельного персонажа

Например добавить вместо индивидуальной работы с индивидуальным ИИ расписания , добавить РОЛИ. И вместо ручной отправки на активность, конкретного NPC - отправить лишь одного или нескольких из обладателей роли.

Например роль члена какой то семьи, роль помощника трактирщика, и роль сектанта культа - и у трактирщика будет с пяток помощников, из которых постоянно работать будет только 2е и лишь один из них сектант, а так же у каждого из помощников будет своя семья и будет проводить часть времени с ней

И в квестах связанных с культом - герой сможет встретить одного из сектантов, в том числе и знакомого помощника трактирщика.

Так же можно добавить для NPC роль обывателя конкретного поселения, который может встретится на рынке, храме , кладбище и прочих общественных местах.

Это решение позволит расширить численность поселений в сравнение с типичными хуторами бетезды на 10-20 NPC (Если не заметили в Starfield лучистый АИ отключили - все NPC на скриптах в локациях).

И создать сложные детективные сюжеты, и разнообразить реиграбельность, так как NPC с определенной ролью будут чередоваться у разных людей.

Случайный кандидат

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

(Найди шпиона в гильдии)

Схожая идея была в игре про Blade Runners из 90х

Роли которые задаются отношением к протагониста или через квесты

В Skyrim у NPC есть список друзей и недругов. Если герой вредит друзьям - это NPC это огорчает и они могут потребовать принести извинения или даже прислать убийц.

Если герой вредит их врагам - они присылают благодарственное письмо.

Так почему бы не расширить идею когда в зависимости от действий героя персонажи не могут пойти в антогонистичную фракцию для героя? Или податься в бандиты если квест приведет к разорению?

Как насчет свободно раздавать листовки, зелья, а потом столкнуть игрока с последствием раздачи предметов от подозрительных лиц?

Предметы в комплекте с ролью

Нужно не забыть добавить простейшие предметы которые будут генерироваться у персонажа при отыгрывание той или иной роли

Так же можно привязать к NPC его персональный сундук(или несколько) куда будет складывать ненужные предметы.

Пул NPC на замену

Как мы можем видеть на примере того же скайрима иногда персонажи смертны, иногда внезапно смертны и хоть иногда их место могут занять их слуги/родственники. Но иногда и они могут закончится

Кажется в некоторых случаях выгоднее добавить десяток НПС бродяжничить между локаций, но которые смогут занять место чей то роли по одной из специализации(воин/маг/вор).

4.9K4.9K показов
1.4K1.4K открытий
11 репост
29 комментариев

интересно, спасибо
есть у меня ощущение, что сложно поведение npc в большинстве игр не делают не потому, что не могут, или там времени не хватает, а потому, что считают, что это не важно, и что "и так сойдёт"

Ответить

У меня складывается ощущение. Что снала боятся потому задача кажется большой и сложной. А потом просто некогда.
И на выходе получае киберпанк где у ботов самый минимум делают.

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

Ответить

Нет, не не только поэтому, а потому что более 50-10 честных АИ уже нагружает систему

Ответить

Вспоминается статья, одного из разработчиков ecs фреймворка. Она как раз таки про то как организовать код, чтобы предоставить AI возможность быстро получать данные о мире через единый интерфейс, чем то напоминающий БД. Тут правда есть нюанс, можно ли это действительно провернуть и будет ли возможность заменить текущую архитектуру разработки игр основанную на сущностях и компонентах.
https://ajmmertens.medium.com/why-it-is-time-to-start-thinking-of-games-as-databases-e7971da33ac3

Ответить

Можно ли создать универсальное решение для всех игр? Наверное нет. Точнее можно, но оно будет избыточным.

Для каждого "жанра" игр - есть свой ... назовем это шаблон механик и инстурументов редактирования формат хранения данных, - поверх которых собственно игра и будет строится.

Тот же анрил это буквально в своей основе 3д шутерный движок - и чем дальше от шутера - тем больше всякого разного поверх него нужно накручивать. Создать на нем шутер можно на банальных БП без строчки С++ кода.

Для РПГ типа Скайрим - как написал в статье - нужно страндартное решение позволяющие вывести понятие ID у NPC и ID у локации. Причем жедательно простое и удобное и позволяющие редактировать геймдизам свободу расписания на ходу. Как в тес констракшн сет.

Скажем в анриле такого решения из коробки нет, его нужно будет создавать дополнительно, причем именно в коде C++ что бы оно работало с редактором движка. Что бы не делать этого ручками через ту же систему БП.

А для РТС скажем понадобится другое решение которое будет привязвать Навигационные меши юнитов и сам тип и неровности ландшафта - что позволит сразу получать игровые карты и расставлять на них юниты. Причем оно должно быть максимально оптимизированно.

В общем есть над чем думать.
Сначала вопрос - чего мы хотим,
Потом вопрос - кто мы и чего можем
а потом компромис между этими двумя понятиями.

Тут что бы не вышло как в анекдоте : че думать, тут трясти нужно!

Выделить важные особенности жанра игры, потом определеить сущности которые будут действовать - и потом уже садиться работать, но при этом прикол что при таком подходе не получится работать над всем одновремено со всем - работа будет вестись раздельно.

Придется сначала подождать когда закончат базовую часть интерфейсов - прежде чем их геймдизам на расстерзание отдавать.

Это как в создании локаций скайрима - геймдизайнеры не делали пещеры вообще - пока художники китбаши локаций не смоделят.

Ответить

Комментарий недоступен

Ответить

Если обсчитывать всех существ - то комп повиснет
Данное решение позволяет обсчитывать только тех кто должен в локации оказаться.
Простое решени синхронизации и вуаля все думают что у тебя в студии не 100 человек - а тысяча :D

Ответить