Открытия при создании своей игры

Как это часто бывает, стоит углубиться в какое-то дело, как открывается целая вселенная новых смыслов, проблем и нетривиальных решений. С помощью нейросети я реализую мечту всей своей жизни о создании собственной игры. И хоть я и проработал в IT много лет, но серьёзное программирование меня отторгает как я ни пытался к нему подступиться, поэтому только появление нейросетей вернуло мне веру в детскую мечту.

Меню временное, а вот скользящий фоном пейзаж с высоты птичьего полёта, думаю, останется.
Меню временное, а вот скользящий фоном пейзаж с высоты птичьего полёта, думаю, останется.

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

Первая POI - стартовая локация, первые 30 секунд в автомобиле работает двигатель и горит свет, затем он несколько раз моргает и гаснет, оставляя игрока во тьме одиночества.
Первая POI - стартовая локация, первые 30 секунд в автомобиле работает двигатель и горит свет, затем он несколько раз моргает и гаснет, оставляя игрока во тьме одиночества.

Тут случилось откровение первое - даже примитивная картинка может просаживать производительность неплохого железа. Всегда нужны оптимизации - так был придуман круг света. То есть, оптимизация стала геймплеем - игрок путешествует во тьме, видя на ограниченной дистанции. За кругом света мир не отрисовывается и производительность снова прекрасная. Но в будущем по мере роста игры приходилось производить новые и новые оптимизации, а самой прожорливой системой и по сей день остаётся пасфайндинг.

Миру не хватает жизни - так появились первые населяющие его твари, примитивные зомби из нескольких кубов и параллелепипедов, сгенерённые и анимированные машиной по описанию. Им была дана свобода воли и два состояния - шататься по лесу, при виде игрока идти к нему. Вторым откровением здесь стало осознание, что синхронизация координатных систем это сложно. Вот смотри - есть глобальная координатная сеть мира с его понятиями верх, низ, лево, право, вперёд и назад. У модели зомби - своя локальная система координат. Более того, у каждой отдельной движущейся части тела модели зомби - своя система координат. А у игрока - ещё одна. Поэтому простая на словах конструкция "Зомби увидев конусом зрения из глаз игрока поворачивается в его направлении" технически совсем не так проста, как кажется. Всем частям тела зомби надо объяснить, где у них "вперёд", а анимированным - ещё и ориентацию относительно тела.

Совсем от рук отбился
Совсем от рук отбился

Откровение третье - невидимые стены отстой. С одной стороны - расширять пустую карту смысла не имеет, а с другой - упираться в стены максимально обламывает. Решение было найдено - тороидный мир, свёрнутый в бублик. Если свернуть в сферу маленькую карту - получится ерунда - слишком крутой изгиб горизонта, ты будто по мячику бегаешь малюсенькому. А вот тор - идеальная форма. Горизонт всегда плоский, но мир при этом закольцован и пройдя его в любом направлении ты вернёшься в исходную точку. Когда у тебя сгенерённый ландшафт с деревьями без отличительных точек интереса - мир кажется бесконечным. Здесь возникли проблемы с обработкой стыковочных швов - игроку же надо видеть за шов ещё до его пересечения - дым и зеркала приходят на помощь! Система подгружает за швом копии чанков с другой стороны карты, поэтому можно увидеть свой затылок. Гораздо сложнее оказалось подгружать динамические объекты и ещё сложнее работать со швами алгоритмам поиска пути, но коробочка с магией справилась и с этими вызовами.

В порядке организованной очереди работяги выходят на смену из мест ночлега
В порядке организованной очереди работяги выходят на смену из мест ночлега

Четвёртое откровение - алгоритм поиска пути это сложно и ресурсоёмко. Чтобы зомби шатался по лесу убедительно - нужен алгоритм принятия решений и прокладывания пути. Зомби должен обходить деревья и других зомби. Деревья не двигаются, а зомби двигаются. Игрок тоже, тварь, двигается - как его преследовать вообще?! Пересчёт пути каждый кадр приводил ПК в состояние кататонического ступора и пришлось сидеть крепко думать над оптимизациями. Была придумана система, где у зомби есть дальняя цель и текущий короткий маршрут. Вектор к цели делится на отрезки, просчитывается путь до конца отрезка, затем уточняется цель - не занята ли, не сместилась ли? Строится новый вектор и снова делится на отрезки и так до достижения цели. Так зомби научились гулять по лесу и бегать за игроком.

Уютный домик в лесу, полном зомби, ничего ведь страшного не случится, если мы в нём немного погостим?
Уютный домик в лесу, полном зомби, ничего ведь страшного не случится, если мы в нём немного погостим?

Откровение пятое - взаимодействие игрока с миром это сложно. Ходить, крутить мышью и прыгать оказалось самым простым. Пришла пора добавить геймплея - с зомби надо что-то делать и было принято решение их отстреливать. Сгенерён по описанию дробовик (далеко не с первого раза, надо понимать!), придумана планетарная система его следования за камерой - то есть он не фиксирован как в обычном шутере, а наводится мышью в пределах экрана. Это иммерсивно и усложняет процесс стрельбы - у нас тут хоррор, а не шутер всё-таки! Здесь снова начался кошмар относительных систем координат - дробовик поворачивается относительно направления взгляда игрока, а стрелять должен по линии в глобальных координатах мира, попадая в зомби, существующего в своих локальных координатах. А убитый зомби ещё и должен упасть в правильном направлении на лицо или ТОЛЬКО НЕ НА ЛИЦО. Это был настоящий кошмар сродни попытке объяснить дементному родственнику кто ты такой и где мы находимся. Один дробовик это скучно, поэтому был добавлен ещё фонарь. Фонарь служит двум вещам - отодвигает тьму дальше и вселяет во врагов ужас, заставляя их бежать со всех ног за пределы освещённого круга, чтобы оттуда злобно зыркать глазками.

Известный рок-музыкант потерял голову от окружающей красоты, оставив после себя дробовик и 4 патрона
Известный рок-музыкант потерял голову от окружающей красоты, оставив после себя дробовик и 4 патрона

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

Колосс, сжирающий жертву целиком живьём, всегда в скверном расположении духа и ненавидит деревья
Колосс, сжирающий жертву целиком живьём, всегда в скверном расположении духа и ненавидит деревья

Откровение седьмое - ходьба это сложно. Растёт игра, углубляется геймплей, модели врагов и их анимация становятся интереснее. Вот по лесу уже бродит 4 вида нежити - ходок обыкновенный, ползун, бодипозитивный жирдяй и король кошмара - колосс. Налажена экосистема - ходоки и ползуны жрут трупы сородичей и превращаются в жирных, жирные продолжают жрать трупы и становятся колоссами. По небу регулярно проплывает Луна, чутко реагирующая на стрельбу гневным взором, поднимающим мёртвых и шарящим по земле в поисках игрока. И всё вроде ничего в статике, но в движении - неубедительно. Монстры скользят над землёй изображая шаги. Пришлось углубиться в вопрос и объяснять нейронке принципы шага, расписывая все фазы. Так родился движок ходьбы. Теперь скорость передвижения напрямую зависела от скорости шага, потому что пока нога не будет оторвана и вынесена вперёд - шага не произойдёт. Стало намного лучше!

Стартовая POI и начало приключения

Откровение восьмое - развороты это сложно. Монстры научились правильно ходить и даже учитывают перепады высот, поднимая или опуская ногу перед ступенькой воксельного ландшафта. Но повороты и развороты вокруг своей оси выглядят ужасно! Тут я узнал о иерархическом повороте: сначала в желаемом направлении поворачивается голова, затем торс по пояс и только после этого ноги. Так-то лучше!

Откровение девятое - строения и заборы это сложно! Сказочный лес с монстрами это прикольно, но скучно - нет цели, нет исследования, нет нарратива. Нужны POI - точки интереса в лесу, двигающие сюжет и влияющие на игровой процесс. Для начала хватит трёх штук: Стартовая локация - брошеная машина с открытым багажником, возле которой игрок начинает свой путь, Кладбище - функционально важное место, здесь игрок подбирает дробовик и здесь из могил вылезают новые ходоки каждый цикл Луны для продолжения веселья, пополнения прореженных игроком рядов и санитарной обработки леса от трупов упокоенных. Хижина в лесу - классическая избушка со входом, окнами и мебелью, вокруг которой тоже надо прокладывать пути и без того не шибко умной нежити. Точки интереса это сложные объекты - тут тебе и препятствия, которые трупам надо обходить и оградки/окна через которые надо перелезать. Конечно, всё решаемо - вот зомби прыгают в окна и через заборы, отряхиваются и снова идут выразить своё восхищение игроку.

Кладбищенская братва: Гнев Луны

Откровение десятое - звуки это сложно. Единственная вещь, кроме идей, которую не делает в игре нейросеть - это озвучка. Звуки я беру в бесплатных банках и в процессе с удивлением обнаруживаешь, как же много нужно разных звуков! Самая база - это фоновый эмбиент, задающий атмосферу, затем звуки шагов - должны быть разные у разных монстров, сопение, пыхчение, звуки пожираемой плоти, боли, смерти, погони за игроком, выстрелы, перезарядка, звуки прохождения через кроны деревьев, эмбиент POI и Луны. Целая прорва звуков, да ещё желательно иметь на каждое действие набор звуков для вариативности. Ужас!

Сегодня колосса ем я

Невероятно увлекательный процесс производства своей игры открывает глаза на многие вещи которые казались само собой разумеющимися, но под капотом содержат множество нюансов и трудностей, решение которых само по себе интересная головоломка. То, что начиналось как любопытный эксперимент по ходу дела обросло идеями, дизайном и даже сюжетом, так что надеюсь однажды довести дело до конца и заложить в свою игру максимум вариативности и сюрпризов, делающих каждый запуск уникальным опытом.

А завтра колосс ест меня.