Я недавно начал увлекаться разработкой игр на Unity. Решил сделать 3D-игру по типу PacMan, где игрок управляет субмариной, охотясь за рыбами в лабиринте. Рыбы трех типов: съедобные, опасные и ядовитые. У каждого типа свое поведение. В момент разработки я столкнулся с проблемой: я не знал, как правильно работать с автономными агентами. Поэтому я начал рассматривать разные способы, но мое внимание захватила статья на Хабре про Steering Behaviors.

Чтобы лучше вникнуть в тему, советую сначала ознакомиться с этой статьей. Ниже я вкратце и общо расскажу, что такое Steering Behaviors и ее основные типы, а затем попробую объяснить, как я использовал этот подход на практике.

Имитация естественного движения на основе Steering Behaviors

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

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

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

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

Основные типы управляющего поведения

Движение к цели (seek). Данное поведение реализует перемещение агента в направлении целевого объекта. Для этого вычисляется вектор от текущего положения агента к цели, после чего направление скорости корректируется так, чтобы движение происходило в сторону этой точки. Поведение seek является одной из базовых форм управляющего поведения, так как задает простейший механизм направленного движения в непрерывной среде.

Вектор движения к цели
Вектор движения к цели

Прогнозирующее преследование (pursuit). Поведение pursuit представляет собой развитие движения к цели, при котором агент ориентируется не на текущее положение объекта, а на его предполагаемую будущую позицию. Для этого учитываются направление и скорость движения цели, что позволяет формировать более точную траекторию сближения при взаимодействии с подвижным объектом.

Прогнозирующее преследование цели
Прогнозирующее преследование цели

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

Прогнозирующее уклонение от угрозы
Прогнозирующее уклонение от угрозы

Свободное блуждание (wander). Поведение wander описывает движение агента при отсутствии фиксированной цели. В этом случае сохраняется общее направление движения, однако в него периодически вносятся небольшие случайные отклонения. За счет этого формируется непрерывная, плавная и менее предсказуемая траектория. Один из классических способов реализации wander заключается в наложении малых случайных смещений на текущее направление движения агента, что позволяет избежать резких изменений курса и создать эффект естественного перемещения.

Свободное блуждание агента
Свободное блуждание агента

Избегание препятствий (collision avoidance). Поведение collision avoidance предназначено для снижения вероятности столкновения агента с препятствиями среды. При обнаружении объекта по ходу движения агент корректирует направление перемещения таким образом, чтобы обойти препятствие и сохранить дальнейшее движение. Данное поведение обычно используется совместно с другими локальными правилами и обеспечивает согласование траектории с геометрией пространства.

Избегание препятствий
Избегание препятствий

Описание игровой сцены

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

Основным динамическим объектом, влияющим на навигацию, является субмарина. Ее положение, направление движения и факт сближения с рыбой определяют дальнейшее поведение игрового агента. Для рыб используются различные режимы реакции на субмарину, благодаря чему игрок сталкивается не с однотипным движением объектов, а с несколькими вариантами поведения в одном и том же пространстве.

Модель поведения рыб-агентов в игре

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

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

Алгоритм следования
Алгоритм следования

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

Алгоритм преследования
Алгоритм преследования

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

Алгоритм избегания
Алгоритм избегания

Таким образом, съедобные рыбы реализуют схему «следование с последующим уклонением», а опасные и ядовитые рыбы реализуют схему «следование с переходом к преследованию и атаке». Выбор конкретного алгоритма определяется типом рыбы.

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

Математическое описание разработанных алгоритмов

Для формального описания поведения рыб-агентов введем следующие обозначения:

  • x_s — позиция субмарины;

  • x_f — позиция рыбы;

  • v_f — вектор скорости рыбы;

  • \Delta t — шаг моделирования по времени;

  • R — радиус зоны взаимодействия;

  • v_{\text{max}} — модуль скорости рыбы;

  • u — вертикальный вектор сцены;

  • t_{\text{life}} — время существования рыбы;

  • T_{\text{max}} — максимально допустимое время жизни рыбы.

Расстояние между рыбой и субмариной определяется выражением:

d = \| x_s - x_f \|

Единичный вектор направления от рыбы к субмарине задается как:

e_t = \frac{x_s - x_f}{\| x_s - x_f \|}

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

Алгоритм следования

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

e_{\text{follow}} = e_t

Чтобы движение не выглядело строго прямолинейным, в направление добавляется малая случайная составляющая:

e_{\text{follow}}^* = \frac{e_{\text{follow}} + k_r r}{\| e_{\text{follow}} + k_r r \|}

где r — случайный вектор малого модуля, k_r — коэффициент случайного отклонения.

Алгоритм преследования

Алгоритм преследования применяется для опасных и ядовитых рыб и задает устойчивое сближение с субмариной. В этом случае целевое направление движения совпадает с направлением на субмарину:

e_p = e_t

Чтобы исключить мгновенную смену курса, используется плавное обновление направления:

e_{\text{new}} = \frac{(1-\alpha) e_{\text{cur}} + \alpha e_p}{\| (1-\alpha) e_{\text{cur}} + \alpha e_p \|}

где e_{\text{cur}} — текущее направление движения рыбы, \alpha \in [0,1] — коэффициент плавности поворота. Тогда скорость рыбы определяется выражением:

v_f = v_{\text{max}} \, e_{\text{new}}

Алгоритм избегания

Алгоритм избегания применяется для съедобных рыб. Пока расстояние до субмарины превышает радиус взаимодействия R, рыба движется по алгоритму следования:

d > R \quad \Rightarrow \quad e = e_{\text{follow}}^*

При входе в область (d \leq R) рыба переходит к боковому уклонению. Для задания бокового направления используется векторное произведение вертикального вектора сцены и направления на субмарину:

e_{\text{side}} = \frac{u \times e_t}{\| u \times e_t \|}

Итоговое направление уклонения определяется как комбинация бокового смещения и удаления от субмарины:

e_{\text{avoid}} = \frac{\beta e_{\text{side}} - \gamma e_t}{\| \beta e_{\text{side}} - \gamma e_t \|}

где \beta — коэффициент бокового отклонения, \gamma — коэффициент удаления от субмарины.

Тогда правило выбора направления для съедобной рыбы можно записать в виде:

e = \begin{cases}e_{\text{follow}}^*, & d > R \\e_{\text{avoid}}, & d \leq R\end{cases}

Обновление состояния и удаление из сцены

После выбора направления скорость и положение рыбы обновляются по формулам:

v_f = v_{\text{max}} \, ex_f (t + \Delta t) = x_f (t) + v_f \Delta t

Каждая рыба существует в сцене ограниченное время. Если время жизни объекта превышает заданное значение, рыба удаляется из сцены:

t_{\text{life}} \geq T_{\text{max}}

Таблица 2 - Описание состояний рыбы в разработанной модели

Состояние

Описание

Условие входа

Переход

1

Появление

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

Спавн объекта.

Определение типа.

2

Определение типа

Устанавливается принадлежность рыбы к одному из типов: опасная, ядовитая или съедобная.

Объект рыбы создан.

Выбор частной реакции по типу рыбы.

3

Выбор частной реакции

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

Тип рыбы определен.

Для опасной и ядовитой рыбы: преследование. Для съедобной рыбы: уклонение.

4

Преследование

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

Тип рыбы определен как опасная или ядовитая.

Следование к субмарине.

5

Следование к субмарине

Рыба перемещается в направлении субмарины до входа в зону преследования или зону уклонения.

Активирован режим преследования или режим поведения съедобной рыбы.

Проверка нахождения в соответствующей зоне.

6

Проверка зоны преследования

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

Рыба следует к субмарине в режиме преследования.

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

7

Столкновение с субмариной

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

Рыба вошла в зону преследования.

Проверка факта контакта.

8

Проверка контакта

Проверяется, произошел ли контакт рыбы с субмариной.

Выполняется столкновение с субмариной.

При наличии контакта: игровой штраф. При отсутствии контакта: проверка времени жизни.

9

Игровой штраф

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

Контакт с субмариной произошел.

Удаление рыбы из сцены.

10

Уклонение

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

Тип рыбы определен как съедобная.

Следование к субмарине.

11

Проверка зоны уклонения

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

Рыба следует к субмарине в режиме уклонения.

При достижении зоны: боковое смещение от субмарины. При недостижении: продолжение следования к субмарине.

12

Боковое смещение от субмарины

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

Рыба вошла в зону уклонения.

Проверка поимки игроком или проверка времени жизни.

13

Проверка поимки

Проверяется, была ли съедобная рыба поймана игроком.

Выполняется боковое смещение от субмарины.

При поимке: игровой бонус. При отсутствии поимки: проверка времени жизни.

14

Игровой бонус

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

Рыба поймана игроком.

Удаление рыбы из сцены.

15

Проверка времени жизни

Проверяется, истекло ли допустимое время существования рыбы в сцене.

Не произошло завершающее событие взаимодействия.

При истечении времени: удаление рыбы из сцены. При неистекшем времени: возврат к текущему режиму движения.

16

Удаление рыбы из сцены

Объект рыбы удаляется, его жизненный цикл завершается.

Истекло время жизни либо зафиксирован игровой результат.

Конечное состояние.

Поведение рыбы относительно субмарины
Поведение рыбы относительно субмарины

Результаты

Выбранная реализация основана на steering behaviors, что позволяет совместить вычислительную простоту с визуальной реалистичностью. Алгоритмы используют базовые векторные операции, благодаря чему расчеты выполняются в реальном времени без заметной нагрузки. Небольшое количество параметров делает модель удобной для настройки и балансировки.

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