Mosquito Invasion VR - мой опыт создания VR игрушки для Android
Всем привет! Пару месяцев назад я решил исполнить свою давнюю мечту и создать свою собственную ламповую игрушку для смартфона. Поскольку тема виртуальной реальности начинает все чаще мелькать в постах и новостях, я решил запилить именно VR игру.
Хоть я и знаком с OpenGL, идея писать все с нуля в голом NDK меня не прельщала. Писать игру решил с использованием библиотеки Libgdx, потому что во-первых, она кроссплатформенная, а во-вторых, я с ней уже давно знаком, и даже писал раньше небольшие игрушки "в стол". Первое, с чем я столкнулся, - это полное отсутствие поддержки VR. В целом, libgdx - неплохая библиотека, но ее разработчики знатно тормозят и не торопятся следовать трендам современности. Выхода из ситуации было 3:
1) Использовать Cardboard SDK
2) Использовать Unity
3) Реализовать "headTracking" вручную в рамках libgdx
В первых двух случаях мне пришлось бы переучиваться и вставать на новые рельсы, поэтому эти варианты я сразу отбросил. Кроме того, у меня неприязнь к Unity)) Хоть я и понимаю, что это очень удобный движок в плане переноса на другие платформы с огромным комьюнити, но у меня в душе он ассоциируется с конструктором для школьников типа ucoz-а. Я выбрал третий вариант, и после нескольких недель гугления и вчитывния в формулы публикаций по Oculus Rift, я родил собственную реализацию комплементарного фильтра, который позволяет отслеживать вращение головы с помощью акселерометра, гироскопа и компаса, причем в моей реализации последние два датчика не обязательны. В случае отсутствия гироскопа углы вращения виртуальной головы определяются по наклонам телефона при помощи акселерометра, по-моему это первое подобное решение в VR играх. Большинство игр просто не запускаются на телефонах без гироскопа.
Перед началом разработки я начитался постов про пожизненную блокировку разработчиков в Google Playe за ворованный контент, поэтому решил все модели, текстуры и звуки делать самостоятельно. Пришлось в кратчайшие сроки освоить основы моделирования в Blender по видеоурокам и создать модель комнаты с комарами:
Звуки записывал на телефон и обрабатывал в Ocenaudio, либо синтезировал в LMMS:
Кстати, со звуком в libgdx вообще все плохо. Во-первых, стандартный Sound никак не фиксирует момент готовности файла к воспроизведению. Во-вторых, soundPool андроида, который используется в Sound, весьма забагованная вещь, которая работает по-разному от версии к версии. Я обнаружил, что в Android ниже 4.3 он не умеет высвобождать память от ненужных звуков в процессе работы приложения, из-за этого в игре может пропадать звук. Причем в версиях 4.3 и выше такой проблемы нет. Тем не менее, мне все равно пришлось практически полностью переписать стандартные классы работы со звуками из libgdx, создав тем самым свой мини-движок, который имитирует трехмерный звук (чисто изменением громкости каналов, без бинаурального эффекта).
Для получения стереопары на экране используются два разных viewport-а:
Текущий счет и количество жизней выводятся на экран виртуального телика. Вообще в целом игрушка представляет собой масштабируемый движок, который получился весьма оптимизированным за счет отказа от дополнительных библиотек с кучей ненужного мусора. Я сделал собственный формат описания уровней, запилил к нему парсер. Поддерживается скелетная анимация объектов уровня, эффекты из системы частиц и шейдеры. Игрушка выдает 60 fps практически на любом смартфоне с android 5.0+ и 1 гигом оперативы, обеспечивая очень плавную анимацию поворота головы. И вообще, у меня сложилось впечатление, что большинство VR игр в маркете созданы какими-то далекими от геймдева людьми, потому что они подлагивают даже на моем далеко не самом плюшевом телефоне (Asus ZE551ML). Я изначально боролся за каждый кадр, каждое умножение и деление, поэтому по сравнению с остальными VR играми маркета, моя создает ощущение, будто играешь в сам Oculus. Вот еще пару скринов:
Кроме того, в игре есть обычный режим на полный экран (без VR):
В ближайшее время планирую добавить новые уровни, над одним из них, кстати, работаю прямо сейчас:
Немного опоздал к хэллоуину с хоррор-локацией, но все равно доведу до конца)
Видео геймплея (ускоренное): https://www.youtube.com/watch?v=KJer-dD1uwU
Буду рад услышать замечания и пожелания)
Лига Разработчиков Видеоигр
6.6K поста22.1K подписчиков
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"