5 июня 2015 5.06.15 3 1924

Разработка игры. Бродилка. [Лог#12]

+6

Если кратко

В этом логе Вы сможете почитать о моих размышлениях на тему искусственного интеллекта для игры Бродилка.
Общие идеи, как он должен работать и почему он лучше типичного зомби-ИИ. Приготовьтесь к сплошному тексту, но хорошо хоть немного картинками разбавил :)

Возможно уже все забыли о проекте, а он живёт, вернее спит и не хочет просыпаться! Но ничего, расшевелить его можно)

Предыдущий | Сборник | А теперь…

Ближе к теме

Общее

Итак искусственный интеллект(ИИ), что же он представляет из себя? Не знаю как это делают профи или же специалисты в этой области, но должен заметить, что игровой ИИ и ИИ в общем — это разные понятия, думаю это многим очевидно. Из игрового ИИ не получится создать ГЛэДОС(Portal), ШОДАН (System shock) или Скайнет(Terminator).

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

В Бродилке же ИИ больше должен играть роль не вражеской сущности, а живого мира — что же это значит? Всё очень просто — на любое действие игрока должно быть некое «противодействие» со стороны игровых объектов с ИИ.
Вот пример: толпа зомби — прост бегут к игроку и им не важно, что игрок в этот момент делает, например, стреляет из огнемёта, а они всё равно бегут — от такого я постараюсь избавиться.
Пример того, как это должно быть (в перспективе):
Игрок бежит и махает мечом, при этом жуки увидев игрока начитают убегать от игрока, а те жуки, что не видели игрока, но заметили как убегают их сородичи — аналогично начинают бежать.

Жуки, жуки повсюду

В качестве подопытного ИИ в этом логе я возьму жука и не спроста — они первое, что увидит игрок (в рамках ИИ). Да и эти насекомые наиболее интересные живые объекты в игре так как они должны «собираться из разных частей», а именно из головы, туши и «рубашки». Если вдруг забыли, то вот старый концепт с вариантами жуков и их рубашек:

Вообще ИИ жука и скажем робота — идентичны, различия лишь в некоторых настройках или же параметрах.
Поведение решил строить основываясь на некоторых параметрах, признаюсь, что не знаю точно как он всё будет работать и будет ли вообще, но я надеюсь на лучшее :)
Итак пока я вывел три параметра для ИИ:
трусость — думаю очевидно, что это значит. Параметр (как и все) задаётся в промежутке [0.0..1.0], где 1 — максимальный страх при «виде» игрока.
шестое чувство — задаёт насколько ИИ чувствителен к присутствию игрока, например, если выставить это значение в 1, то ИИ вне зависимости от направления взгляда «почувствует» игрока.
агрессия — опять же очевидно. Если 1, то атаковать игрока без размышлений.

Некоторые из этих параметров противоречат друг другу, например, если и агрессия в 1, и трусость в 1, то как же должен вести себя ИИ? Возможно, ещё не все параметры подмечены, если есть какие мысли — поделитесь этим в комментариях.

Ещё стоит отметить воздействие со стороны игрока. Если игрок представляет угрозу… но как эту угрозу определить? Является ли персонаж, который только что выкосил орду демонов, а затем пошёл на поле к пасущемся козам опасным? Тут вступает некая сущность оценивающая поведение игрока — слишком сложно? Согласен, поэтому необходимые функции этого объекта я перекину на так называемого GameMaster'а — главный игровой объект.
Игрок машущий мечом, который только что-то разобрался с толпой роботов, парой грибов-мутантов — опасен? На самом деле нет — вот какое заключение должен выдать GameMaster. Почему? Игрок разве крошил на права и налево беспомощных и беззащитных мелких жучков? Конечно нет.

я есть в этом мире

Должен сказать и про представление жука-разумного в игровом мире. И вообще как должна работать общая часть ИИ.
Для начала — конус видимости или другими словами «глаза» ИИ.

Угол Альфа — угол обзора из глаз (делённый на два). Думаю тут ничего пояснять ненужно, хоть на картинке и не виден конус, но он есть так как трёхмерное пространство и ничто не мешает перевести его в двухмерное.
Максимальная дистанция (d) — очевидно. Макс.дистанция видимости. Помните про «шестое чувство»? Оно реализуется как раз в рамках этой окружности — игнорируя конус видимости.

Должен заметить, что это весьма интересная тема и как-то смысле простая. Аналогичный вид зрения я уже реализовал в игре Z3m_0vl3n.

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

Красные точки — потенциальные варианты куда идти.
Оранжевые линии — рейкаст(ray cast) или же проверка луча на столкновение с объектами. Видно, что точки 2 и 3 забракованы т.к. они находятся в геометрии уровня или же там есть какой-то другой крупный объект. Точки 1 и 4 доступны. Возможен такой сценарий: можно двигаться только в точку, которую видно — тут подходит только 1, однако, ИИ можно разрешить двигаться куда угодно, тогда подойдут и 1, и 4.

С этой плоскостью всё ясно — можно такое разработать и возможно переписал 100500 раз у меня это всё же заработает :)
А теперь высота или «я шагаю в бездну» — как избавиться от такого? Очень просто — ещё один рейкаст.

Как видно, если «бросание луча» даёт хоть какой-то результат в точке ( I и II ), то поверхность есть, если же нет пересечения (III), то там пустота и как следствие гибель.
Что отличает точки I и II? Высота. Для поведения ИИ можно указать максимально допустимую высоту с которой он может «спрыгнуть» или наоборот — на какую высоту он может «прыгнуть».
На данной картинке случай I имеет высоту h — допустимая высота, а вот случай IIH — уже слишком высоко.

Если с потенциальной точкой движения всё ясно, то теперь можно и про игрока поговорить:

Тут 4 потенциальные позиции игрока. Ещё помните про «шестое чувство», конус видимости и максимальную дистанцию? Вот они как раз тут и есть.

Рассмотрим вариант 1:
Игрок вне дистанции и как следствие — вне конуса видимости. Даже экстрасенсорные способности не помогут — игрок который вне макс.дистанции — не обрабатывается.

Рассмотрим вариант 2:
Всё аналогично первому. Вне дистанции — игрока для жука не существует.

Рассмотрим вариант 3:
Находится в окружности, но вне конуса видимости. Если «сенсоры» установлены в 1, то тогда жук заметит («увидит») игрока, а иначе в зависимости от другого значения (например 0) игрок будет невиден.

Рассмотрим вариант 4:
В окружности, попадает в конус видимости — даже «шестое чувство» не нужно. Игрок виден.

Теперь же, основываясь на некоторых параметрах можно реализовать какое-то конкретное поведение:
нападение или убежать в страхе, а может… ничего не делать и дальше себе бродит или стоять и пастись )

Думаю понятно чего я хочу добиться от ИИ в общем или конкретно в поведении жуков.

Что дальше?

Думаю дальше развить это всё дело и начать кодить или на бумажке ещё раз всё проверить и реализовать.
Возможно, задену генератор жуков, немного моделирования или чего-то подобного. Вообще вы можете ознакомиться со списком на будущее — это то, что пока в приоритете. Может ещё чего по локациям )

Всем мир, чуваки!


Лучшие комментарии

Мог бы я сказать, что я устал и ухожу, но нет! Ведь я МУХОЖУК!
А это Первый Комментарий к жучино-интеллектуальному посту! :)
По моему мнению главная задача игрового ИИ — красиво проиграть игроку.

Золотые слова!
Золотые слова!

Уверен на 146%, что я явно не первый, кто говорит такие слова )
Читай также