Войти
ПрограммированиеФорумИгровая логика и ИИ

Хорошие реализации AI в проектах с открытым кодом

#0
8:43, 24 фев. 2021

История моих страданий:
заметил в себе отвращение к разработке текущего проекта из-за рутинной громоздкой работы с написанием AI. Делаю топ-даун шутер и принципиально хочу уникальное и умное поведение каждого из мобов. Например, они должны пока не видят игрока патрулировать территорию, затем, если видят, то гнаться за ним, потом иметь возможность потерять его, если упустили из виду, потом начать активно искать, потом снова переходить в фазу спокойного патрулирования. А другие мобы не должны сломя голову гнаться за игроком и вплотную к нему подходить исходя из их уникального типа атаки и т.д. Игра с джема и раньше поведения там описывалось в отдельных класах, писать было быстро, но потом разбираться долго, сложно править и можно было наделать ошибок. Перенёс AI на FSM, всё осталось также, только теперь ещё и писать их долго, повторной используемости не добавилось, объёмы кода сопоставимые. Проект встал, заметил в себе отвращение к разработке из-за рутинной громоздкой работы с написанием этих AI. Живу с надеждой, что можно подсмотреть готовые архитектурные решения, которые сделают всё красиво. Возможно, это психологическая проблема и нужна помощь специалиста другого рода.

Вопросы:
Поделитеcь опытом решения этой задачи? Что вы делаете с AI? есть ли какие-нибудь изящные реализации в готовых движках? Пора ли задуматься над наймом стороннего кодера для того, чтобы он страдал, а не я?


#1
10:07, 24 фев. 2021

Сейчас очень популярны Behavior Trees и Utility System. Так как тебе не нравиться FSM, то попробуй Utility System.

#2
10:59, 24 фев. 2021

eta
AI by Examples. Там есть код и демки.
http://www.ai-junkie.com/books/toc_pgaibe.html

#3
12:51, 24 фев. 2021

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

Присмотрись к Behavior Tree. Он кстати не отменяет возможности использования элементов SM и Utility.
Основная фишка BT - комплектация редактором, и соответственно большая человекопонятность, быстрая
и предсказуемая модификация. И сам подход "унифицированные ноды" заточен на переиспользование.

С "изящными реализациями" - тут не всё так хорошо. Есть куча либ (со своими трактовками этого паттерна),
и редакторы есть, и в основных движках они есть, но все они мне к примеру не подошли. Но тебе может подойдет.

Я в итоге написал своё дерево (что просто) и пользуюсь готовым редактором графов.

#4
11:18, 25 фев. 2021

martiandweller
С интересом прочитал про Utility System, напоминает нейронную сеть, только каждый нейрон самому задавать эмпирически нужно. Выглядит перспективно, но вижу следующие потенциальные проблемы:
- перещёлкивание между конкурирующими действиями, когда моб выполняет что-то и сразу же становится предпочтительнее выполнение другого действия, делает другое один цикл - снова выше рейтинг у первого действия и так далее, в итоге дёргается и ничего не успевает доделать.
- если начал что-то делать, то это нужно доделывать, но если появляются особые обстоятельства, то не нужно. Получается, некоторые действия должны прерывать длительное действие, а некоторые не должны. В FSM нужно задавать следующие возможные состояния для текущего, а здесь запрещать некоторым действиям прерывать текущее состояние - довольно громоздко.

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

rcsim
Попробую присмотреться. Пока вопросы примерно такие же, как и к Utility System из-за того, что, насколько я понял, мы рассматриваем на каждом шаге все возможные действия и нужно отдельно указывать, переход к каким действиям запрещён из текущего состояния.

Всем спасибо за рекомендации!

#5
12:09, 25 фев. 2021

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

Ты что-то путаешь: в Behavior Tree нет состояний сущности (ai-агента). Там есть статус (результат исполнения) конкретной ноды.

#6
13:46, 25 фев. 2021

Не могу ничего сказать про другие движки, ИИ брался писать только на Юнити. Конечно огромную роль играет то что я очень хорошо с ним знаком.
Ну так вот, я просто использую дерево состояний, поскольку все остальное уже есть в движке. Соответственно задачи у них только в виде места куда идти. Три места - общие задачи, оперативные задачи. Оперативные задачи в приоритете перед общими. И откуда забрать/куда привести. Причем я даже колеблюсь надо ли определять им намерения, зачем они идут в то место. На всякий случай конечно определяю, но все показывает что можно обойтись без них, так как сами места куда они ходят по факту уникальны. Например пришли они в город, которых сотни, но каждый город имеет свой набор уникальных свойств. Или пришли они на пустырь, что еще там делать? Разворачиваемся лагерем. И т.д.
Выглядит примерно так:
- Действие когда нет задач
- Расчет провизии (у меня армия потребляет пищу. Наивысший приоритет, т.к. с голоду все передохнут и вообще воевать на голодный желудок дизморально).
  - Действие по результатам расчета в оперативные задачи
- Расчет личного состава
  - Действия по результатам расчета в оперативные задачи
- Идем в оперативные задачи
- иначе, идем в общие задачи
- иначе, идем в откуда забрать/куда привести

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

Для НПС не менее просто. Ну к примеру мне надо выдерживать строй. Я просто создал шаблон из пустышек этого строя и двигаю его по карте, а нпс говорю чтобы они шли в координаты пустышек. Причем мне даже не надо контролировать дошли ли они, я смотрю их состояние "движения", все еще идут они, или уже пришли.
Укрытия - тоже самое. У каждого укрытия есть объект к которому они будут идти и набор свойств этого укрытия которым они будут пользоваться. Надо ли выдерживать строй если укрытий не достаточно, опять же известно - скажем если у противника есть танк или артиллерия, то очевидно надо рассредоточиться.

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

ПрограммированиеФорумИгровая логика и ИИ