Статьи, посты, подкасты, лекции и другие выступления

Как я сделал VR-игру за три дня на Ludum Dare 39

Статьи
Почти год прошел с моего прошлого участия на Ludum Dare, когда я с командой запрототипировал и запустил разработку игры SMASH BASH: Date with the Desert. С тех пор как-то не было повода участвовать ещё. Но недавно у меня появилась возможность разрабатывать под HTC Vive и я не мог упустить такую возможность. В итоге за три дня сделал собственную игру под VR, в которую сам же с удовольствием поиграл. Если есть под рукой HTC Vive, то рекомендую поиграть в игру прежде, чем читать дальше.

Для меня достаточно очевидно, что VR, AR и MR прочно войдут в наш быт уже в ближайшие годы. Сейчас технология находится на том же уровне, на котором находились все остальные технологии, изменившие нашу жизнь — гиковская, дорогая, неудобная, тормозная, но при этом работающая и выдающая результат. Для меня окончательную точку ставит телеграм-канал ARKitот Luden.io, показывающий что можно делать, используя последние модели айфонов, то есть устройств, которые уже лежат в кармане миллионов пользователей. И в воздухе уже витают слухи о том, что Apple, Facebook и Google работают над своими вариантами Hololens от Microsoft, чтобы было такое же автономное устройство, но по доступной цене и возможностью купить в ближайшем салоне сотовой связи. Эта хрень ворвется в нашу жизнь стремительным домкратом, а уровень геймдизайна некоторых VR/AR игр находится на уровне “обычная 3D игра с возможностью смотреть с разных сторон”. Вот мне и захотелось немного прокачаться в создании VR игр, чтобы не остаться на обочине.
Старт этого желания появился во время занятий с моими студентами на курсе по созданию игр на Unity в Scream School. Одно из занятий я посвятил знакомству студентов с технологией VR. За три часа занятия студенты проходили путь от “первый раз одеваю VR шлем” до прогулок по миру, который они сами только что сделали. Мне тогда прямо во время занятия пришла идея воткнуть источник света в объект одного из контроллеров, а остальные источники света в сцене отключить. Меньше минуты манипуляций и внезапно у меня получился отличный хоррор.
Кадр из игры для Ludum Dare. Желаемый эффект достигнут.

Перед началом Ludum Dare я уже четко знал, что хочу повторить этот эксперимент. В качестве теста собрал небольшую сцену из бесплатных ассетов и ещё раз утвердился в идее. В качестве геймплея попробовал следующую идею: нужно найти выход с локации, при этом на локации есть монстр, который медленно, но неумолимо следует за игроком. Эдакий лабиринт с минотавром.
Перемещение сделал с помощью точек телепорта, чтобы таким образом немного замедлить передвижение игрока — ведь нужно прицелиться в нужную точку. При нажиме на кнопку телепортации все точки телепортации становились видимыми, даже если они за препятствиями. Когда таких точек несколько десятков, то уровень начинает выглядеть новогодней ёлкой. Пришлось покопаться в коде, чтобы не показывать все точки дальше определенного радиуса от игрока.
В субботу утром, 29 июля, я узнал тему джема: Running out of Power (заканчивается энергия/силы). Поскольку у меня уже был заготовлен концепт, то пришлось тему натягивать как сову на глобус. Типа у меня должно быть темно, а значит энергия уже закончилась. Почему закончилась? Потому что это сделал опасный враг. Что за враг? Ну, моделить я толком не умею, поэтому собрал абстрактного врага из летающих кубов. Назвал это “Проект 424”, вспомнив про тему крипипасты и SCP.
Поскольку в этот раз моей целью было освоить работу с VR, то создание базовых ассетов я решил проскипать, обратившись к Asset Store. Первым делом полистал наборы ассетов для сборки локаций и решил остановиться на этом наборе, как довольно дешёвым, разнообразным и низкополигональным, без выкрутасов. Меньше всего я хотел сесть в лужу с низкой производительностью.
В последствии оказалось, что у выбранного конструктора есть несколько существенных недостатков:
— Для материалов использовались устаревшие шейдеры и пришлось настраивать их заново.
— Большинство объектов шарит один материал, что позволяет значительно улучшить производительность (не забыв включить инстансинг). Но когда камень и металл настраиваются одним материалом, то тут либо камень не камень, либо металл не металл.
— У всех объектов дефолтный скейлинг не равен 1, а сами объекты по-дефолту вверх ногами. Явно были проблемы с тем, чтобы выставить правильные размеры в 3D редакторе и правильно проэкспортить.
— Хотя конструктор для того и конструктор, чтобы все элементы стыковались по сетке (снэпились), но ряд объектов у одного из зданий тупо не подходили по размеру и при стыковании оставляли заметные щели. Приходилось либо не использовать их, либо двигать и скейлить вручную, что моветон.
— Опечатки в названии файлов — это вообще фейспалм. Причем, создающий рабочие проблемы, так как эти файлы быстрым поиском не ищутся.
— В наборе нет ни одной модели для источника света.

Кусочек локации на основе этого конструктора.

Впрочем, за $5 вполне терпимые проблемы. Ещё $2 заплатил за модель фонарика. К ней вообще никаких нареканий, отличный фонарик. Затем выложил ещё $25 за набор скриптов для различных способов управления персонажем в VR (locomotion). Остальные ассеты нашел среди бесплатных:
— Ночное небо из вот этого набора.
— Материал лавы для использования на противниках. Мне нужен был материал с красивым свечением (emissive).
— Конструктор, из которого взял модели фонарей, чтобы были свои источники света.
— Модель пистолета очень высокого качества. Благодаря наличию подвижных частей, я сделал ему анимацию стрельбы. Немного повозился, пока не догадался, что для такой короткой анимации не нужен блендинг с айдловым состоянием. Ещё с ним и фонариком пришлось немного похимичить, чтобы добавить эмиссив, чтобы можно было видеть свои руки даже в полной темноте.
— Модель автомобиля. Хотелось показать связку между стартовой локацией и началом игры.
— Набор эффектов, из которого взял эффект для попадания. Пришлось его немного подкрутить, чтобы был подходящего размера, а на частицы действовала гравитация.
— Звуки выстрелов и эмбиента. В основном с сайта https://freesound.org/ 

Материалы на пистолете прям очень вкусные, но заметны только при правильном освещении.

Идея перемещаться телепортами мне очень быстро разонравилась. Это ведь надо несколько сотен точек раскидать по всему уровню, протестировать их и затем каждый раз при телепортации наблюдать как в мире игры появляются игровые условности. А ведь прелесть VR в погружении и мне хотелось по возможности сохранить это погружение. Мне понравилось как сделано передвижение в игре GORN, когда движение осуществлялось махами рук. К счастью, в ассет сторе нашлось решение с arm swing, правда всего одно и то с проблемами.
Из проблем, с которыми я с удивлением столкнулся:
— Часть функционала находилась под заголовком Coming Soon. К счастью, это было про способы передвижения, которые не были мне интересны.
— В коде было прямое упоминание версии Unity 5.6, что привело к ошибкам в версии 2017.1.
— Передвижение махами рук работало только для левой руки. Правую руку пришлось дописывать самому.
— Хотя в описании говорится, что этот пакет использует решение SteamVR за основу, но по факту оно не совместимо с решениями от Valve. Так, например, с этим решением не работает взаимодействие с интерфейсом. Я убил порядочно времени, пытаясь подружить код интерфейса от Valve и контроллеры от этих товарищей. Не получилось и пришлось решать всё костылем: триггер вокруг кнопки, реагирующий на попадание в него контроллером.
— Мануал невнятный, лежит в Google Docs, на который ссылка в файлах пакета. Можно было бы и не заметить. И всё равно пришлось поломать голову в поисках места, где настраиваются параметры передвижения. Потому что они настраиваются не в персонаже, а в камере, которая лежит в глубинах персонажа.
— Телепорт по дуге поломанный, может телепортировать только на ближайший метр. Да ещё и выглядит некрасиво. К счастью, я как раз хотел отказаться от телепортации.
Но все же этот пакет меня спас, так как он позволил достаточно комфортно и свободно перемещаться по всей поверхности, на которую посчитался NavMesh (который мне и так, и так считать для противников). Только с поднятием по узким лестницам вышла беда — был высокий шанс проскочить лестницу вместо того, чтобы на неё залезть. Поэтому я не стал в геймплее делать ставку на использование лестниц. Перемещение происходило только по направлению взгляда, но это оказалось даже лучше, чем в GORN, где меня немного укачивало от движения боком.
Красные кубики — это враги. Стоит одному из них коснуться игрока и всё, game over.

Противников я сделал следующим образом. Каждый противник спавнит в небольшом радиусе от себя пачку кубов. Каждый куб умеет рандомно вращаться и скейлится. При попадании пули куб включает физику и отлетает в соответствии с ней. Когда у противника заканчиваются кубы, то он считается убитым. Повесил на него звук и лампочку, чтобы можно было реагировать на приближение, а также понимать переход в состояние смерти. Получилось довольно крипово. Изначально противники очень медленные, что добавляет им крипоты. Но с каждым отстреленным кубом скорость противника увеличивается. Чем дальше по уровню, тем больше у противников кубов, а поэтому на последних кубах скорость противника очень высокая. Играясь с балансом мне удавалось создать ситуации, которые я не мог пройти. Но для Ludum Dare решил не перегибать палку.
Долго думал что же такое сделать по главной задаче игрока. В голове постоянно крутился Slender с его задачей найти 8 записок, но хотелось что-то своё. К середине третьего дня так ничего хорошего не пришло в голову, поэтому просто облепил опоры ЛЭП теми же кусками, из которых состоят противники. Сбиваешь все куски с опоры — включается освещение на части уровня. Очищаешь все три вышки — игра пройдена. Решение не фонтан, так как оставляет незадействованным огромную часть уровня, но все же решение работающее и интуитивно понятное для игрока.
На скриншоте увеличена яркость и всё равно нефига не видно, а в шлеме с изначальной яркостью всё норм.

Кстати, о врагах и стрельбе по ним. Мне сначала нравилась идея сделать одного врага, с которым нельзя справиться, но от которого можно убегать. Фильм Оно (It Follows) как раз отлично обыгрывает эту тему (там ещё про передачу проклятья половым путем есть). Но начав делать игру я понял, что такой противник лишь сначала пугает, а потом становится предсказуемым и скучным. К тому же, чтобы игрока не укачивало, ему хорошо бы время от времени делать перерывы в движении. Значит игрока надо чем-то занять. Стрельба — механика, которая раскрывает особенность управления под VR. Вот и решил, что чего бы нам не пострелять. Всё равно надо чем-то занять руку, свободную от фонарика. Кулдаунами и перезарядкой решил не осложнять себе и игрокам жизнь. Пусть хоть тут можно будет популять вдоволь.
Обычно на Ludum Dare я выкладываюсь так, что потом неделю отхожу. Но в этот раз я уже к началу джема был вымотан и на следующей неделе тоже полно дел, поэтому джемил я как джемят музыканты — не спеша, наслаждаясь процессом. В первый день я обдумывал идею, прикидывал ассеты, составлял общий план локации, а под вечер вообще поехал на митап разработчиков игр DevsGo, где внезапно оказался в числе спикеров.

Слева направо: я, Александр Пашин, Илья Туменко

Второй день для меня был самым кайфовым — большую часть дня я занимался левел-дизайном, собирая локацию. Очень умиротворяющее занятие. Слово собирать конструктор Лего.

Общий вид на основной уровень при дневном освещении.

А вот третий день был болью, так как на него пришлась работа с функционалом. Приходилось много итерировать. Поправлю что-нибудь в коде, одеваю шлем проверить, затем меняю настройки и снова в шлем. Такая частая смена реальностей немного выбивает из равновесия. Когда я вечером решил сбегать в магазин, то на пути постоянно одергивал себя на мысли, что двигаюсь слишком быстро и могу врезаться в стену в другой реальности.
В целом всё прошло гладко. Было только две проблемы. Про сломанную работу с интерфейсом я писал выше. Второй проблемой было запекание освещения. Я не знаток настройки света в Unity, но мне показалось, что если Directional Light поставить в режим Baked, то это улучшит производительность. А оказалось, что после долгих расчетов теней даже на маленькой сцене, они куда-то исчезали. Пришлось откатить источники света обратно в режим Mixed. И ещё почему-то собранный билд запускался в настройках Very Low, хотя по-умолчанию я поставил Very High. Пришлось вернуть обратно стартовый ланчер Unity, где качество графики можно было выбрать ручками.
Дальше оставалось только снять геймлейное видео для тех, у кого нет HTC Vive, сделать пачку скриншотов и оформить страницу игры. Что собственно и сделал, чем завершил своё участие на Ludum Dare.

Страница игры на Ludum Dare



Какие выводы я для себя сделал?

  1. Да, VR — это технология будущего. Это не 3D-кино, где эффект был ради маркетинга и вызывал раздражение, вместо погружения. Тут же такой эффект погружения, который никак иначе достичь нельзя.
  2. VR игры связаны с физическим движением. Это полезней для здоровья, чем сидячие игры.
  3. Передвижение взмахами рук работает, не укачивает и по всем фронтам лучше телепортов. Хотя, может тут я сужу по себе, у меня ведь уже организм немного попривык к VR.
  4. Картинка в шлеме выглядит светлей, чем на экране. Это нужно учитывать и как-то подпирать, высветляя картинку на мониторе, иначе в такие игры не интересно наблюдать со стороны — сплошная чернота.
  5. Делать игры под VR совсем не сложно. Вся основа работает из коробки.
  6. Нужен стол на колесиках, чтобы его можно было выкатывать в VR зону и тестировать фичи не бегая туда-сюда.
  7. Интенсивность тестирования в VR нужно дозировать. Частое одевание-снимание шлема не торт. Потестил функционал — отвлекись на работу с контентом.
  8. Детализация — это не про VR. Разрешение так себе, поэтому детализированные ассеты превращаются в кашу, а низкополигональные ассеты выглядят норм.
  9. И вообще главное не детализация, а ощущение пространства.
  10. Нужно писать свой локомоушен, который бы других со SteamVR и его фичами.
  11. В производительность не уперся — хорошо. Спасибо Unity.
  12. Нельзя провести плейтест VR-игры, просто кинув ссылку друзьям. Надо планировать заранее, чтобы плейтестеры были прямо на месте разработки, где есть оборудование для игры.