Программирование поведения агентов в играх – трудоёмкий и сложный
процесс. В современных системах поведение агентов основывается на данных об
окружении, поступающих в режиме реального времени. Задача может приобретать
высокую вычислительную сложность, поскольку возникает необходимость в
постоянном отслеживании изменений и соответствующей модификации поведения.
В данной работе предлагается метод создания структур, которые позволят
оптимизировать и упростить задачу вычисления поведения агентов в играх.
Для оптимизации и упрощения задачи вычисления поведения был спроектирован модуль, автоматически
генерирующий деревья поведения с подсказками. Оптимальность этого дерева
обеспечивается учётом метрик, задаваемых пользователем и представляющих цели,
которые должен достигнуть агент. Таким образом для агентов осуществляется
генерация дерева поведения, позволяющего достичь определенные цели в условиях
неизвестного окружения. Для оптимизации деревьев поведения в случаях, когда
изменение окружения предполагает сильные изменения поведения агента, используются
деревья поведения с подсказками. Это позволяет избежать перестроения деревьев и
ускорить вычисления. Благодаря тому, что для генерации требуются только знания
об окружении и агенте и метрики целей, упрощается создание и модификация
сложных систем.
Инструмент генерации структур реализован в виде модуля для платформы
Unity с использованием языка программирования C#. На вход генератору подаётся
список знаний об окружении и возможностях агента и список метрик целей. На
выходе получается структура, представляющая собой оптимизированное дерево
поведения с подсказками.
Знания о возможностях агента представляют собой обобщенные классы со
статическим методом выполнения. Каждый такой класс соответствует одному
поведенческому примитиву, который может выполнить агент. В результате генерации
поданные на вход классы становятся листьями дерева поведения.
Список знаний об окружении определяется для каждого агента и представляет
собой класс с полями, содержащими необходимые для поведения переменные
окружения. Обобщенные классы знаний о поведении типизируются соответствующим
агенту классом знаний об окружении. Таким образом, для переиспользования примитивов
поведения несколькими агентами достаточно, чтобы их классы знаний об окружении
реализовывали общий интерфейс, который и будет использоваться в классе
поведения (рис. 2).
На вход методу выполнения в классе поведения подается экземпляр
класса знаний об окружении, определенный внутри скрипта объекта и изменяемый каждый
раз, когда информация об окружении меняется.
Рис. 2. Диаграмма
классов знаний об окружении и поведенческих примитивов
Список метрик целей представляет собой список функций, принимающих
на вход экземпляр класса знаний об окружении и возвращающий числовую метрику,
которую надо максимизировать.
Результат работы генератора – экземпляр класса дерева поведения с
единственным методом выполнения, который выполняет цикл прохода по дереву с
последующим исполнением методов поведения.
Благодаря такой структуре разработчик имеет возможность переиспользовать
ранее созданные элементы поведения для разных типов агентов и определять
базовые поведенческие примитивы (такие как перемещение к определенной точке)
единожды. Каждый агент в таком случае использует определенное подмножество
классов из общей библиотеки примитивов, которые и будут учитываться при
генерации дерева поведения для данного объекта.
Также подобная система поведения может быть использована в разных
проектах, если в них используются те же поведенческие примитивы и знания
агентов об окружении. Сгенерированные деревья поведения не привязываются к
определенному скрипту поведения и также могут быть использованы любым агентом,
который использует те же поведенческие примитивы и знания об окружении которого
реализуют необходимые интерфейсы.
Автоматическая генерация может быть востребована в сложных и плохо
масштабируемых системах. Поскольку генерируемое дерево поведения является
оптимальным, упрощаются вычисления в случае изменения окружения агента.
Дальнейшее развитие проекта предполагает улучшение алгоритмов генерации для
возможности более тонкой настройки, а также перенос модуля на другие платформы.