Подготовка билдов для дистрибуции в 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 дня на цикл |
Стоимость определяется после анализа проекта и состояния текущей сборки.





