tags: [vr-ar]
Підготовка білдів для дистрибуції в SteamVR
Опублікувати VR-гру в Steam технічно складніше, ніж звичайну десктопну. Справа не в самому Steamworks SDK — він добре документований. Складність в тому, що SteamVR-приложення обслуговує кілька шарів одночасно: Steam Runtime, OpenVR/OpenXR overlay, compositor, та все це має коректно стартувати, реєструвати маніфест та не конфліктувати з іншими headset-специфичними шарами типу Oculus Runtime на PC.
Що конкретно перешкоджає нормальному запуску з Steam
Перше, що ломається у більшості — vrmanifest. Це JSON-файл, який SteamVR використовує для реєстрації приложення в OpenVR. Якщо він не прописаний коректно або не лежить у правильному місці відносно виконавчого файлу, SteamVR не поймет, що приложення — VR. Гра запуститься в desktop-режимі, без stereo rendering, користувач отримає чорний екран у headset.
Структура manifest.vrmanifest:
{
"source": "builtin",
"applications": [{
"app_key": "steam.app.ВАШ_APP_ID",
"launch_type": "binary",
"binary_path_windows": "YourGame.exe",
"is_dashboard_overlay": false,
"strings": {
"en_us": {
"name": "Your VR Game",
"description": "..."
}
}
}]
}
Поле app_key має точно збігатися з App ID у Steamworks. Помилка у одному символі — та маніфест ігнорується без помилок у лог-файлі.
Другий клас проблем — Steam Depots та конфігурація Steam Build. Для VR-гри рекомендується мінімум два депо: базовий контент та окремий депо під високоякісні текстури, щоб користувачі з менш потужними машинами могли завантажити облегчену версію. Настройка Launch Options у Steamworks має явно прописувати -openvr або -openxr флаг залежно від используемого backend у Unity/Unreal.
У Unity з OpenXR Plugin важливо перевірити, що XR Plug-in Management настроєний з правильним порядком providers: OpenXR має йти першим, інакше при запуску через Steam без активного VR Runtime гра упадає на ініціалізації з исключенням XRLoader failed to initialize.
Підготовка пакету: від білду до Steamworks
Сборка релізного білду для Steam відрізняється від dev-сборки кількома параметрами. У Unity: IL2CPP backend (не Mono), Strip Engine Code включен, Managed Stripping Level — Minimal або Low для VR (агресивний стриппінг регулярно ломає reflection-based код у XR SDK). Compression Method — LZ4HC для прискорення розпакування при першому запуску.
Після сборки — верифікація через Steam Content Builder (steamcmd). Локальний тест через steam://run/APPID перед завантаженням у Steam гарантує, що manifest підхоплюється. Якщо SteamVR не стартує автоматично при запуску через Steam — дивимось у C:\Program Files (x86)\Steam\logs\vrserver.txt та openvr.log у папці гри.
Для OpenXR-проектів додатково перевіряємо наявність openxr_loader.dll у папці з виконавчим файлом та коректність XR_RUNTIME_JSON змінної оточення — Steam може переопределяти її при запуску.
Тестування перед публікацією
Обов'язкові сценарії до сабміту:
Холодний старт: запуск через Steam без попередньо відкритого SteamVR — VR Runtime має підніматися автоматично. Гарячое переключення: запуск з уже відкритим SteamVR, потім смена headset (якщо тестуємо мульти-HMD сумісність — Index + Quest через Link). Запуск у non-VR режимі: гра не має крашитися, якщо VR Runtime недоступний, — або graceful fallback, або зрозуміле повідомлення.
Тест на Valve Index, якщо гра позиціонується як PC VR — обов'язковий: там свої особливості з finger tracking через SteamVR Skeletal Input та Lighthouse tracking.
| Масштаб задачі | Орієнтовні строки |
|---|---|
| Настройка маніфесту + Steamworks config | 1–2 робочих дні |
| Повна підготовка пакету з depot setup | 3–5 робочих днів |
| Ітераційні правки після QA Steam | 1–2 дні на цикл |
Вартість визначається після аналізу проекту та стану поточної сборки.





