Проектирование Непредсказуемого Интеллекта В Играх. Часть 2. Анализ Толпы

Как сделать умную толпу в игре и почему важен лидер толпы.



Проектирование непредсказуемого интеллекта в играх.
</p><p>
 Часть 2. Анализ толпы

Толпе нужен лидер, даже толпе зомби.



Введение

Если вы не читали первую часть, советую начать с нее( Часть 1 - архитектура ).

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

Оформить толпу можно по-разному; Самый простой способ сделать это — использовать простое дерево поведения, но в этой статье я начну проектировать толпу с помощью метода GOAP, который я описал в предыдущей статье.

Примеры будут написаны на C# и движке Unity 3d, потому что.

он очень хорош для быстрого прототипирования подобных сцен и легкого тестирования гипотез и новых архитектур.

Подробные реализации я скрою, а сами исходники прикреплю как проект на GitHub.

Отказ от ответственности : Большинство концепций мои собственные; Я описываю архитектуру и анализирую механику на основе своего опыта и исследований.

В своих статьях я стараюсь сосредоточиться на дизайне и концепции, а не на реализации.

Я не буду упрощать логику и злоупотреблять комментариями, некоторые фрагменты кода будут из боевых проектов, а архитектура вполне готова к работе из коробки.

Поэтому разжевывания элементарных вещей в программировании здесь тоже не будет. Наслаждайся чтением!

Вычислительные сложности искусственного интеллекта

Несомненно, любая форма архитектуры ИИ наносит удар по вычислительной мощности сервера/игрового устройства.

Предложенная форма GOAP из предыдущей статьи имеет большой недостаток — для каждого NPC без многопоточности расчет вероятности вызова цели будет происходить отдельно в течение каждого кадра.

Представим себе простую сцену, где у нас одновременно есть N персонажей (из 100).

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



Проектирование непредсказуемого интеллекта в играх.
</p><p>
 Часть 2. Анализ толпы

Рисовать такое количество разных персонажей – это совершенно отдельная задача.

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

Большинство двигателей используют пространственный поиск .

Если стоит задача реализовать NPC на сервере (например, .

Net Core или C++ сервере), то она осложняется отсутствием таких утилит и этот метод придется реализовывать с нуля.

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

), прогнозирование движения и компенсация задержки/задержки , а также системы мониторинга изменений мира (особенно важно для игр-песочниц).

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



Толпа

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

Толпы не являются отдельными типами NPC и, скорее всего, не будут отражать высококачественное поведение каждого объекта в отдельности (кроме локальных взаимодействий и IK/анимации).

Для работы с толпой нам нужна сущность лидер .

Лидер — это основной блок, в котором будут обрабатываться все вероятностные расчеты.

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

Кратко это так: есть сущность члена группы (скажем, член толпы ) и лидер группы ( лидер толпы ).

Руководитель группы строит план действий на основе своего основного образца; участники группы, в свою очередь, повторяют его действия и могут добавлять незначительные вариации.



Базовая архитектура

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

1. Подготовка Так.

Нам нужна сцена, нам нужны капсулы, самолет, навмеш и спаунер.



Проектирование непредсказуемого интеллекта в играх.
</p><p>
 Часть 2. Анализ толпы

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

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

1. Архитектура ГОАП Здесь все так же, как и в предыдущей статье, нам понадобится скелет нашего GOAP, чтобы его можно было расширить.

Я не буду заполнять вас примерами кода; Ознакомиться с подходом можно в репозитории.



Проектирование непредсказуемого интеллекта в играх.
</p><p>
 Часть 2. Анализ толпы

Коротко о скриптах и о том, что у нас есть: • Атомные цели - простейшие задачи, часто состоящие из одного действия и отслеживающие статус выполнения цели.

Композитные цели - составные задачи, которые собирают либо несколько CompositeGoals, либо несколько AtomicGoals. • Основной - абстракции архитектуры.

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

Функции - утилиты для целей, например поиска героев вокруг.

Движение - корневой функционал для движения.

За основу взята логика рулевого движения из книги.

«Программирование игрового ИИ на примере».

NPCOfflineManager И ОффлайнNPC - плагины, касающиеся спауна и обработки NPC ThinkGoal .

2. Интеллектуальный дизайн Если вы запускаете игру, где каждый является индивидуальностью, с определённым набором оценщиков, например ExploreGoal, IdlingGoal, LookAtPlayerGoal (базовый набор, который я рассматриваю в статье), то мы получим самостоятельные юниты, которые движутся или стоят в случайном порядке.



Проектирование непредсказуемого интеллекта в играх.
</p><p>
 Часть 2. Анализ толпы

Через несколько секунд НПС разбегаются в разные стороны и начинают существовать отдельно.

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

Помня, что для создания толпы мы должны обладать сущностью лидера и члена группы, следующим шагом будет создание связи.

лидер группы .

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

  1. Мы повторяем цели лидера, не оценивая их.

    Эоценщики всех задач NPC не будут использоваться, а значит нагрузка на каждые N мс «мозга» не нужна;

  2. Используйте систему уведомлений и полностью отдельную логику от GOAP для участников группы.

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

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

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

Реализация логики толпы

Шаг 1. Для начала распределим персонажей по цветам.

Далее нам понадобится возможность голосовать за лидера — можно добавить отдельный оценщик, который будет оценивать необходимость голосовать за лидера на каждом тике.

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

Обозначу основные правила, которые необходимо учитывать в такой схеме:

  • Голосование происходит до тех пор, пока не истечет время для него, каждый голос определяется уникальным идентификатором, по которому персонажи продолжают голосовать до тех пор, пока не будет выбран лидер;
  • Участники могут голосовать только один раз;
  • Если лидер уничтожен, голосование начинается заново;
  • Лидером становится NPC, за которого проголосовало большинство;

    Проектирование непредсказуемого интеллекта в играх.
</p><p>
 Часть 2. Анализ толпы

    Таким образом, каждая группа получает своего лидера.

Полный код спавнера
   

public class NPCSpawner : MonoBehaviour {

Теги: #Разработка игр #Дизайн игр #разработчик игр #искусственный интеллект #AI #C++ #unity #искусственный интеллект #разработка игр #unity3d #дизайн игр #crowd #goap #intellect
Вместе с данным постом часто просматривают: