Открытия при создании своей игры
Как это часто бывает, стоит углубиться в какое-то дело, как открывается целая вселенная новых смыслов, проблем и нетривиальных решений. С помощью нейросети я реализую мечту всей своей жизни о создании собственной игры. И хоть я и проработал в IT много лет, но серьёзное программирование меня отторгает как я ни пытался к нему подступиться, поэтому только появление нейросетей вернуло мне веру в детскую мечту.
Начиналось всё вполне безобидно - я очень люблю воксельные миры и игры с применением воксельных или псевдовоксельных технологий. А ещё я не люблю готовые решения, под которые надо подстраиваться, поэтому уверовав во всесилие машинного разума я попросил нейросеть создать мне воксельный ландшафт с перепадами высот в градациях серого, по которому можно перемещаться от первого лица. К ландшафту добавились сгенерированные воксельные ели.
Тут случилось откровение первое - даже примитивная картинка может просаживать производительность неплохого железа. Всегда нужны оптимизации - так был придуман круг света. То есть, оптимизация стала геймплеем - игрок путешествует во тьме, видя на ограниченной дистанции. За кругом света мир не отрисовывается и производительность снова прекрасная. Но в будущем по мере роста игры приходилось производить новые и новые оптимизации, а самой прожорливой системой и по сей день остаётся пасфайндинг.
Миру не хватает жизни - так появились первые населяющие его твари, примитивные зомби из нескольких кубов и параллелепипедов, сгенерённые и анимированные машиной по описанию. Им была дана свобода воли и два состояния - шататься по лесу, при виде игрока идти к нему. Вторым откровением здесь стало осознание, что синхронизация координатных систем это сложно. Вот смотри - есть глобальная координатная сеть мира с его понятиями верх, низ, лево, право, вперёд и назад. У модели зомби - своя локальная система координат. Более того, у каждой отдельной движущейся части тела модели зомби - своя система координат. А у игрока - ещё одна. Поэтому простая на словах конструкция "Зомби увидев конусом зрения из глаз игрока поворачивается в его направлении" технически совсем не так проста, как кажется. Всем частям тела зомби надо объяснить, где у них "вперёд", а анимированным - ещё и ориентацию относительно тела.
Откровение третье - невидимые стены отстой. С одной стороны - расширять пустую карту смысла не имеет, а с другой - упираться в стены максимально обламывает. Решение было найдено - тороидный мир, свёрнутый в бублик. Если свернуть в сферу маленькую карту - получится ерунда - слишком крутой изгиб горизонта, ты будто по мячику бегаешь малюсенькому. А вот тор - идеальная форма. Горизонт всегда плоский, но мир при этом закольцован и пройдя его в любом направлении ты вернёшься в исходную точку. Когда у тебя сгенерённый ландшафт с деревьями без отличительных точек интереса - мир кажется бесконечным. Здесь возникли проблемы с обработкой стыковочных швов - игроку же надо видеть за шов ещё до его пересечения - дым и зеркала приходят на помощь! Система подгружает за швом копии чанков с другой стороны карты, поэтому можно увидеть свой затылок. Гораздо сложнее оказалось подгружать динамические объекты и ещё сложнее работать со швами алгоритмам поиска пути, но коробочка с магией справилась и с этими вызовами.
Четвёртое откровение - алгоритм поиска пути это сложно и ресурсоёмко. Чтобы зомби шатался по лесу убедительно - нужен алгоритм принятия решений и прокладывания пути. Зомби должен обходить деревья и других зомби. Деревья не двигаются, а зомби двигаются. Игрок тоже, тварь, двигается - как его преследовать вообще?! Пересчёт пути каждый кадр приводил ПК в состояние кататонического ступора и пришлось сидеть крепко думать над оптимизациями. Была придумана система, где у зомби есть дальняя цель и текущий короткий маршрут. Вектор к цели делится на отрезки, просчитывается путь до конца отрезка, затем уточняется цель - не занята ли, не сместилась ли? Строится новый вектор и снова делится на отрезки и так до достижения цели. Так зомби научились гулять по лесу и бегать за игроком.
Откровение пятое - взаимодействие игрока с миром это сложно. Ходить, крутить мышью и прыгать оказалось самым простым. Пришла пора добавить геймплея - с зомби надо что-то делать и было принято решение их отстреливать. Сгенерён по описанию дробовик (далеко не с первого раза, надо понимать!), придумана планетарная система его следования за камерой - то есть он не фиксирован как в обычном шутере, а наводится мышью в пределах экрана. Это иммерсивно и усложняет процесс стрельбы - у нас тут хоррор, а не шутер всё-таки! Здесь снова начался кошмар относительных систем координат - дробовик поворачивается относительно направления взгляда игрока, а стрелять должен по линии в глобальных координатах мира, попадая в зомби, существующего в своих локальных координатах. А убитый зомби ещё и должен упасть в правильном направлении на лицо или ТОЛЬКО НЕ НА ЛИЦО. Это был настоящий кошмар сродни попытке объяснить дементному родственнику кто ты такой и где мы находимся. Один дробовик это скучно, поэтому был добавлен ещё фонарь. Фонарь служит двум вещам - отодвигает тьму дальше и вселяет во врагов ужас, заставляя их бежать со всех ног за пределы освещённого круга, чтобы оттуда злобно зыркать глазками.
Откровение шестое - ориентация трупов на воксельном рельефе это сложно. Нотч всё-таки гений и сделал так, чтобы любая тварь в его мире умещалась на любом кубе рельефа. Я звёзд умом с неба не хватаю и у меня получился более мелкий относительно монстров шаг рельефа. К чему это привело? К тому, что горизонтально лежащий труп либо проваливается в холм, либо висит над склоном. Полнейший отстой и много часов кормления нейронки кашкой в попытке в очередной раз согласовать абсолютные координаты с локальными. Получилось, почти всегда труп правильно ориентируется по склону. Та же история с ползунами - они горизонтально длинные, как дёшево заставить их учитывать рельеф? На словах легко, а на деле опять математика и спортивное ориентирование в координатных системах - точки опоры, усреднение перепадов высоты, допуски по коллизиям.
Откровение седьмое - ходьба это сложно. Растёт игра, углубляется геймплей, модели врагов и их анимация становятся интереснее. Вот по лесу уже бродит 4 вида нежити - ходок обыкновенный, ползун, бодипозитивный жирдяй и король кошмара - колосс. Налажена экосистема - ходоки и ползуны жрут трупы сородичей и превращаются в жирных, жирные продолжают жрать трупы и становятся колоссами. По небу регулярно проплывает Луна, чутко реагирующая на стрельбу гневным взором, поднимающим мёртвых и шарящим по земле в поисках игрока. И всё вроде ничего в статике, но в движении - неубедительно. Монстры скользят над землёй изображая шаги. Пришлось углубиться в вопрос и объяснять нейронке принципы шага, расписывая все фазы. Так родился движок ходьбы. Теперь скорость передвижения напрямую зависела от скорости шага, потому что пока нога не будет оторвана и вынесена вперёд - шага не произойдёт. Стало намного лучше!
Откровение восьмое - развороты это сложно. Монстры научились правильно ходить и даже учитывают перепады высот, поднимая или опуская ногу перед ступенькой воксельного ландшафта. Но повороты и развороты вокруг своей оси выглядят ужасно! Тут я узнал о иерархическом повороте: сначала в желаемом направлении поворачивается голова, затем торс по пояс и только после этого ноги. Так-то лучше!
Откровение девятое - строения и заборы это сложно! Сказочный лес с монстрами это прикольно, но скучно - нет цели, нет исследования, нет нарратива. Нужны POI - точки интереса в лесу, двигающие сюжет и влияющие на игровой процесс. Для начала хватит трёх штук: Стартовая локация - брошеная машина с открытым багажником, возле которой игрок начинает свой путь, Кладбище - функционально важное место, здесь игрок подбирает дробовик и здесь из могил вылезают новые ходоки каждый цикл Луны для продолжения веселья, пополнения прореженных игроком рядов и санитарной обработки леса от трупов упокоенных. Хижина в лесу - классическая избушка со входом, окнами и мебелью, вокруг которой тоже надо прокладывать пути и без того не шибко умной нежити. Точки интереса это сложные объекты - тут тебе и препятствия, которые трупам надо обходить и оградки/окна через которые надо перелезать. Конечно, всё решаемо - вот зомби прыгают в окна и через заборы, отряхиваются и снова идут выразить своё восхищение игроку.
Откровение десятое - звуки это сложно. Единственная вещь, кроме идей, которую не делает в игре нейросеть - это озвучка. Звуки я беру в бесплатных банках и в процессе с удивлением обнаруживаешь, как же много нужно разных звуков! Самая база - это фоновый эмбиент, задающий атмосферу, затем звуки шагов - должны быть разные у разных монстров, сопение, пыхчение, звуки пожираемой плоти, боли, смерти, погони за игроком, выстрелы, перезарядка, звуки прохождения через кроны деревьев, эмбиент POI и Луны. Целая прорва звуков, да ещё желательно иметь на каждое действие набор звуков для вариативности. Ужас!
Невероятно увлекательный процесс производства своей игры открывает глаза на многие вещи которые казались само собой разумеющимися, но под капотом содержат множество нюансов и трудностей, решение которых само по себе интересная головоломка. То, что начиналось как любопытный эксперимент по ходу дела обросло идеями, дизайном и даже сюжетом, так что надеюсь однажды довести дело до конца и заложить в свою игру максимум вариативности и сюрпризов, делающих каждый запуск уникальным опытом.