[Лог #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 - допустимая высота, а вот случай II - H - уже слишком высоко.
Если с потенциальной точкой движения всё ясно, то теперь можно и про игрока поговорить:
Тут 4 потенциальные позиции игрока. Ещё помните про "шестое чувство", конус видимости и максимальную дистанцию? Вот они как раз тут и есть.
Рассмотрим вариант 1: Игрок вне дистанции и как следствие - вне конуса видимости. Даже экстрасенсорные способности не помогут - игрок который вне макс.дистанции - не обрабатывается.
Рассмотрим вариант 2: Всё аналогично первому. Вне дистанции - игрока для жука не существует.
Рассмотрим вариант 3: Находится в окружности, но вне конуса видимости. Если "сенсоры" установлены в 1, то тогда жук заметит ("увидит") игрока, а иначе в зависимости от другого значения (например 0) игрок будет невиден.
Рассмотрим вариант 4: В окружности, попадает в конус видимости - даже "шестое чувство" не нужно. Игрок виден.
Теперь же, основываясь на некоторых параметрах можно реализовать какое-то конкретное поведение:
нападение или убежать в страхе, а может ... ничего не делать и дальше себе бродит или стоять и пастись )
Думаю понятно чего я хочу добиться от ИИ в общем или конкретно в поведении жуков.

Что дальше?

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


Просмотров: 2 300

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


Kenathorn #1 - 4 года назад 5
Для начала скажу, что мне нравится скетч жука. Хотелось бы увидеть его в текстурах. Теперь насчёт комбинирования противоположных по сути параметров ИИ. Это вполне осуществимо. Хотя, агрессивность будет выступать чуть приоритетнее трусости. Например:
При агрессии = 1.0 и трусости = 1.0, поведение может быть таким: NPC атакует игрока. Если игрок даёт какой-либо отпор этому NPC, даже элементарно смотрит на него и машет мечом в сторону атакующего NPC на расстоянии его зрения, то NPC видя угрозу, разворачивается и улепётывает от игрока.
Если параметр трусости меньше, чем 1.0. то можно задать кол-во повреждений, получив которые NPC начнёт спасаться бегством.
Ну а в целом, радует, что ты ещё ведёшь логи. Продолжай в том же духе, будем ждать чего-нибудь нового в Бродилке. :)
prog #2 - 4 года назад 2
Если это будет настоящее 3д, то советую по читать про навмеши и поиск пути по ним, а велосипеды изобретать для летающих противников, которые по навмешам плохо ходят и для прыжков вниз.
DarkDes #3 - 4 года назад 2
prog, хотел про это написать, про навмеши, но пока я не разберусь что это - использовать опасно )
Да и зачем использовать танковую пушку для убийства мухи?) Попробую пока свой велосипед, постараюсь пркдосмотреть вариант перехода к навимешам в виде какой-нибудь функции MoveTo().
alexprey #4 - 4 года назад (отредактировано ) 0
Да и зачем использовать танковую пушку для убийства мухи?)
ты соберешь ту же самую пушку, только с вероятностью выстрелить не в муху, а в себя(
DarkDes #5 - 4 года назад 2
ты соберешь тоже самую пушку, только с вероятностью выстрелить не в муху, а в себя(
Okay (
Это как про Си++ и ногу.
Хоробр #6 - 4 года назад 1
А я думаю, что при агрессии 1 и трусости 1 ИИ был бы интересен, если б он преследовал игрока держась на расстоянии и искал удачный момент (бой с другим ИИ, действие, ходьба по бревну через реку), чтобы напасть, цапнуть и снова отступить. Например: кучка таких "дворняг" представляла бы некую угрозу, даже будучи слабыми по характеристикам.
DarkDes #7 - 4 года назад 0
Хоробр, да, такой вариант тоже был бы интересен)
Сейчас идеологическая небольшая проблема возникает, а именно как от параметра ( значения с плавающей точкой в пределах [0.0 ... 1.0] ) задать сложное поведение. Для трусости, например, всё может быть просто - это что-то вроде модификатора скорости, при котором виден игрок, а как быть с другими и тем более их комбинацией и уникальным поведением - не ясно.
Это короче моя проблема - я не хотел жестко задавать поведение ИИ и сделать небольшую систему параметрического поведения, но не могу придумать как это сделать без использования опять же жестоких проверок типа:
if( param > 0.1 )
doSome1();
else
if( param > 0.3 )
doSome2();
else
if( ... )
Т.е. вот такой вариант плохой как по мне, но пока это единственное решение (с последующей нормализацией параметра)