Если кратко
В этом логе Вы сможете почитать о моих размышлениях на тему искусственного интеллекта для игры Бродилка.
Общие идеи, как он должен работать и почему он лучше типичного зомби-ИИ. Приготовьтесь к сплошному тексту, но хорошо хоть немного картинками разбавил :)
Возможно уже все забыли о проекте, а он живёт, вернее спит и не хочет просыпаться! Но ничего, расшевелить его можно)
Навигатор
Предыдущий | Сборник | А теперь…
Ближе к теме
Общее
Итак искусственный интеллект(ИИ), что же он представляет из себя? Не знаю как это делают профи или же специалисты в этой области, но должен заметить, что игровой ИИ и ИИ в общем — это разные понятия, думаю это многим очевидно. Из игрового ИИ не получится создать ГЛэДОС(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 — допустимая высота, а вот случай II — H — уже слишком высоко.
Если с потенциальной точкой движения всё ясно, то теперь можно и про игрока поговорить:
Тут 4 потенциальные позиции игрока. Ещё помните про «шестое чувство», конус видимости и максимальную дистанцию? Вот они как раз тут и есть.
Рассмотрим вариант 1:
Игрок вне дистанции и как следствие — вне конуса видимости. Даже экстрасенсорные способности не помогут — игрок который вне макс.дистанции — не обрабатывается.
Рассмотрим вариант 2:
Всё аналогично первому. Вне дистанции — игрока для жука не существует.
Рассмотрим вариант 3:
Находится в окружности, но вне конуса видимости. Если «сенсоры» установлены в 1, то тогда жук заметит («увидит») игрока, а иначе в зависимости от другого значения (например 0) игрок будет невиден.
Рассмотрим вариант 4:
В окружности, попадает в конус видимости — даже «шестое чувство» не нужно. Игрок виден.
Теперь же, основываясь на некоторых параметрах можно реализовать какое-то конкретное поведение:
нападение или убежать в страхе, а может… ничего не делать и дальше себе бродит или стоять и пастись )
Думаю понятно чего я хочу добиться от ИИ в общем или конкретно в поведении жуков.
Что дальше?
Думаю дальше развить это всё дело и начать кодить или на бумажке ещё раз всё проверить и реализовать.
Возможно, задену генератор жуков, немного моделирования или чего-то подобного. Вообще вы можете ознакомиться со списком на будущее — это то, что пока в приоритете. Может ещё чего по локациям )
Всем мир, чуваки!
Лучшие комментарии
А это Первый Комментарий к жучино-интеллектуальному посту! :)
Золотые слова!
Уверен на 146%, что я явно не первый, кто говорит такие слова )