В разработке игр «ИИ» означает многое; поиск пути, обучение, обнаружение игроков и т. д. По моему опыту, у большинства разработчиков игр первая проблема с ИИ проявляется в форме принятия решений.

У вас есть NPC, и вы хотите, чтобы они взаимодействовали с игроком несколькими способами. Может быть, они могут говорить, атаковать или убегать. Итак, вы начинаете устанавливать какие-то условия «если-иначе»… и тогда это становится слишком сложным. Чтобы управлять этой сложностью, вы изучаете конечные автоматы и деревья поведения… и это сбивает с толку и чуждо по сравнению с кодом, который вы писали до сих пор.

Введите Утилитный ИИ.

Что такое служебный ИИ?

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

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

Но почему он называется «полезным» ИИ?
Термин «полезный» происходит из утилитаристской этики. В утилитаризме нравственно правильным действием всегда является то, которое приносит наибольшую пользу большинству людей. «Полезность» действия — это показатель того, насколько хорошо оно приносит пользу.

Чтобы лучше понять это, давайте рассмотрим знакомый пример.

Должен забить их всех

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

В частности, мы рассмотрим этот ход в конце боя.

Во-первых, каковы возможные действия Бульбазавра?

1. Tackle (a damaging, normal-type move)
2. Growl (a non-damaging, normal-type move)
3. Leech Seed (a status-inducing, grass-type move)
4. Vine Whip (a damaging, grass-type move)

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

enemy type: fire;
enemy health: low;
enemy status: seeded;

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

Tackle (Score: 7)
- Enemy's health is low, so this damaging move might finish them off
- Enemy's type is fire, so this normal move will deal full damage
Growl (Score: 1)
- Enemy's health is low, so we want to finish them off. Growl deals no damage.
- Growl will still lower the enemy's attack, so it could be useful for our next pokemon. It's a valid option, but not a very good one.
Leech Seed (Score: 0)
- Leech seed has no effect if the enemy's already seeded. We won't choose this option.
Vine Whip (Score: 5)
- Enemy's health is low, so this damaging move might finish them off
- Enemy's type is fire, so this grass move will deal half damage

Теперь, когда у нас есть результаты, мы ясно видим, что Tackle — лучший вариант. Итак, давайте скажем Бульбазавру сделать это:

Это действительно так просто!

Что дальше?

Этот краткий пример дает вам представление о возможностях Utility AI, но это лишь верхушка айсберга. Отсюда мы могли бы добавить больше действий (например, «Бежать» или «Использовать зелье»). Мы могли бы собрать больше данных (например, «мое здоровье» или «скорость врага»), чтобы принимать более эффективные решения. Мы могли бы даже написать несколько вариантов нашего кода принятия решений, чтобы сделать NPC с разными личностями (например, «осторожный» NPC, который предпочитает статусные атаки и лечение).

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

Если вам нужна дополнительная информация о служебном ИИ и дополнительные примеры псевдокода, прочтите публикацию Якоба Расмуссена на Gamasutra.
Если вам нужен конкретный пример реализации служебного ИИ в игровом движке, ознакомьтесь с моей публикацией о служебном ИИ в Unreal Engine или Сообщения в блоге Тома Лумана.

Получайте удовольствие, создавая более умный ИИ с более простым кодом!