Бродилка. Лог #12

Игра изнутри

Если кратко


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

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


 


Ближе к теме

 

Общее
Итак искусственный интеллект(ИИ), что же он представляет из себя? Не знаю как это делают профи или же специалисты в этой области, но должен заметить, что игровой ИИ и ИИ в общем — это разные понятия, думаю это многим очевидно. Из игрового ИИ не получится создать ГЛэДОС(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: В окружности, попадает в конус видимости — даже «шестое чувство» не нужно. Игрок виден.

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

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


Что дальше?

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


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

Похожие статьи

  • Бродилка. Новости №1
    Приветствую!Новости от 25.06.2015 ! Сейчас Кардинальная смена приоритетов и по сути «сиденье в бункере».
  • Бродилочный нелог, а новость №0
    Приветствую!Сейчас В данный момент создаётся модель Люка Скайукера, а вернее делается hi-poly, затем будет low-poly и анимация. Вносятся правки в коды, добавляется немного...
  • Бродилка. [Лог#13]
    «Скажи мне, Люк, — ты мне жук?» © Неизвестный. Если краткоВ прошлый раз поведал я про идеи для ИИ, хотя правильнее будет называть это не «искусственный интеллект», а «бот» — ...
  • Бродилка. неЛог #11
    Если кратко:Немного бесполезный лог содержащий в себе некоторые планы на будущее относительно следующего прототипа. Ближе к темеПрототип номер 2 ничего толком не показал,...
2 комментария
veloc1
Было бы здорово, если бы параметры ИИ каждого типа врагов зависили бы от того, сколько товарещей этого типа он убил и сколько заданий для их босса выполнил. Мне кажется, что такое разделение на фракции сделает мир более динамичным. + фракции можно настраивать против друг друга.
DarkDes
Это хорошая идея. Конечно «банд» не будет, но можно что-то такое придумать для разных видов жуков или типа того. Наверно придется дополнительные параметры вводить т.к. нужно ещё фиксированное поведение вводить ( 100% жук-трус) + поведение от игрока. Да, надо будет эту штуку запомнить и попробовать реализовать )
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.