Unreal Engine 5 и VR с нуля. Часть 8. PreAlpha Darts. Assets Redirectors. Выбор Preview Platform. Oculus MRC. PSO Caching.
Введение
Эта статья будет посвящена завершению прохождения курса "Oculus VR Production for Unreal Engine". В этой статье я расскажу, какие проблемы я встретил при прохождении курса, и как я решал эти проблемы.
Так же я завершил проходить курс по блюпринтам, благодаря ему, я стал лучше понимать как работать с блюпринтами.
Выбор Preview Platform. Android Vulkan Mobile
Из-за ограничений платформ на которые мы разрабатываем продукт, визуальное отображение будет меняться.
Для того чтобы видеть, как игра будет выглядеть в шлеме Meta Quest, необходимо включить превью Android Vulkan Mobile:
Settings>Preview Platform>Android Vulkan Mobile
После компиляции шейдеров, появится иконка Андроид слева от запуска сцены. Таким образом, можно будет переключать Preview Platform.
Проблема 1. Не собирался билд Android (Решено)
В уроке 38 мы делаем пробный билд игры. У меня билд не собирался, из-за ошибок редиректа.
Изучив проблему, я понял, что копируя и перенося некоторые блюпринты и объекты, создавались файлы ссылок на старое местонахождение этих объектов. Избавляться от них, надо с помощью Fix Up Redirectors.
Документация о Redirectors:
Гайд по применению Fix Up Redirectors:
После фикса редиректов, сборка проекта успешно была завершена.
Проблема 2. Не запускается игра с плагином Online Subsystem Oculus (Решено)
Необходимо отключить Online Subsystem Oculus, так как вместо него используются плагин Meta XR.
После смены плагина на Meta XR, необходимо заменить функцию проверки собственности на игру.
Проблема 3. Крашится игра в Android Vulkan Mobile (Решено)
При запуске игры на Meta Quest 3, падает такой лог:
Так же падает Unreal Engine при запуске игры в режиме Android Vulkan Mobile (получается предтестовый запуск Vulkan Mobile можно делать локально, Он будет соответствовать запуску на VR шлеме)
Я создал новый шаблон VR в UE5.3.2, настроил его так же как мой проект и тестовый шаблон запускается исправно. Вероятно, что-то присутствует в проекте, что его ломает.
Решение проблемы: я удалил все строчки настроек под [/Script/Engine.RendererSettings]
Редактор открыл проект со стандартными настройками и игра успешно запустилась в режиме Android Vulkan Mobile:
Было замечено, что включение "Game Discards Unused Material Quality Levels" вызывает краш Vulkan Mobile:
Прикрепляю, что удалил из настроек, я не знаю какая настройка крашила мобильный запуск.
[/Script/Engine.RendererSettings]
r.Mobile.DisableVertexFog=True r.Mobile.AllowDitheredLODTransition=False r.Mobile.AllowSoftwareOcclusion=False r.Mobile.VirtualTextures=False r.DiscardUnusedQuality=True r.AllowOcclusionQueries=False r.MinScreenRadiusForLights=0.030000 r.MinScreenRadiusForDepthPrepass=0.030000 r.MinScreenRadiusForCSMDepth=0.010000 r.PrecomputedVisibilityWarning=False r.TextureStreaming=True Compat.UseDXT5NormalMaps=False r.VirtualTextures=False r.VirtualTexturedLightmaps=True r.VT.TileSize=128 r.VT.TileBorderSize=4 r.vt.FeedbackFactor=16 r.VT.EnableCompressZlib=True r.VT.EnableCompressCrunch=False r.ClearCoatNormal=False r.ReflectionCaptureResolution=64 r.ReflectionEnvironmentLightmapMixBasedOnRoughness=True r.ForwardShading=True r.VertexFoggingForOpaque=True r.AllowStaticLighting=True r.NormalMapsForStaticLighting=False r.GenerateMeshDistanceFields=False r.DistanceFieldBuild.EightBit=False r.GenerateLandscapeGIData=False r.DistanceFieldBuild.Compress=False r.TessellationAdaptivePixelsPerTriangle=48.000000 r.SeparateTranslucency=False r.TranslucentSortPolicy=0 TranslucentSortAxis=(X=0.000000,Y=-1.000000,Z=0.000000) r.CustomDepth=1 r.CustomDepthTemporalAAJitter=True r.PostProcessing.PropagateAlpha=0 r.DefaultFeature.Bloom=False r.DefaultFeature.AmbientOcclusion=False r.DefaultFeature.AmbientOcclusionStaticFraction=False r.DefaultFeature.AutoExposure=False r.DefaultFeature.AutoExposure.Method=0 r.DefaultFeature.AutoExposure.Bias=1.000000 r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True r.EyeAdaptation.EditorOnly=False r.DefaultFeature.LocalExposure.HighlightContrastScale=0.8 r.DefaultFeature.LocalExposure.HighlightContrastScale=1.0 r.DefaultFeature.LocalExposure.ShadowContrastScale=0.8 r.DefaultFeature.LocalExposure.ShadowContrastScale=1.0 r.DefaultFeature.MotionBlur=False r.DefaultFeature.LensFlare=False r.TemporalAA.Upsampling=False r.SSGI.Enable=False r.AntiAliasingMethod=3 r.DefaultFeature.LightUnits=1 r.DefaultBackBufferPixelFormat=4 r.Shadow.UnbuiltPreviewInGame=True r.StencilForLODDither=False r.EarlyZPass=3 r.EarlyZPassOnlyMaterialMasking=False r.DBuffer=True r.ClearSceneMethod=1 r.VelocityOutputPass=0 r.Velocity.EnableVertexDeformation=0 r.SelectiveBasePassOutputs=False bDefaultParticleCutouts=False fx.GPUSimulationTextureSizeX=1024 fx.GPUSimulationTextureSizeY=1024 r.AllowGlobalClipPlane=False r.GBufferFormat=1 r.MorphTarget.Mode=True r.GPUCrashDebugging=False vr.InstancedStereo=True r.MobileHDR=False vr.MobileMultiView=True r.Mobile.UseHWsRGBEncoding=True vr.RoundRobinOcclusion=True vr.ODSCapture=False r.MeshStreaming=False r.WireframeCullThreshold=5.000000 r.RayTracing=False r.RayTracing.UseTextureLod=False r.SupportStationarySkylight=False r.SupportLowQualityLightmaps=True r.SupportPointLightWholeSceneShadows=False r.SupportAtmosphericFog=True r.SupportSkyAtmosphere=False r.SupportSkyAtmosphereAffectsHeightFog=False r.SkinCache.CompileShaders=False r.SkinCache.DefaultBehavior=1 r.SkinCache.SceneMemoryLimitInMB=128.000000 r.Mobile.EnableStaticAndCSMShadowReceivers=True r.Mobile.EnableMovableLightCSMShaderCulling=True r.Mobile.AllowDistanceFieldShadows=False r.Mobile.AllowMovableDirectionalLights=True r.MobileNumDynamicPointLights=4 r.MobileDynamicPointLightsUseStaticBranch=True r.Mobile.EnableMovableSpotlights=False r.Mobile.EnableMovableSpotlightsShadow=True r.GPUSkin.Support16BitBoneIndex=False r.GPUSkin.Limit2BoneInfluences=False r.SupportDepthOnlyIndexBuffers=True r.SupportReversedIndexBuffers=True r.LightPropagationVolume=False r.Mobile.AmbientOcclusion=False r.GPUSkin.UnlimitedBoneInfluences=False r.GPUSkin.UnlimitedBoneInfluencesThreshold=8 r.Mobile.PlanarReflectionMode=0 bStreamSkeletalMeshLODs=(Default=False,PerPlatform=()) bDiscardSkeletalMeshOptionalLODs=(Default=False,PerPlatform=()) VisualizeCalibrationColorMaterialPath=None VisualizeCalibrationCustomMaterialPath=None VisualizeCalibrationGrayscaleMaterialPath=None r.Mobile.AntiAliasing=3 r.Mobile.FloatPrecisionMode=0 r.OpenGL.ForceDXC=0 r.DynamicGlobalIlluminationMethod=1 r.ReflectionMethod=1 r.Shadow.Virtual.Enable=1 r.Nanite.ProjectEnabled=False bEnableVirtualTextureOpacityMask=True r.VT.AnisotropicFiltering=True r.Mobile.EnableNoPrecomputedLightingCSMShader=False r.Mobile.SupportsGen4TAA=False xr.VRS.FoveationLevel=0
Проблема 4. Плагин Oculus Spatializer (Oculus Audio) устарел, необходимо заменить на Meta XR Audio. (Решено)
В уроке 39, мы знакомимся с Пространственным звуком, тут тоже не обошлось без проблем.
Плагин Oculus Spatializer (Oculus Audio) Был заменен на Meta XR Audio. Об этом говорится в документации Meta: https://developer.oculus.com/documentation/unreal/audio-osp-ue/
Необходимо скачать плагин Meta XR Audio:
Инструкция Перепаковки Плагина Meta XR Audio для другой версии Unreal Engine:
На момент написания статьи (05.08.2024), я скачивал 67 версию плагина. 67 версия предназначена для версии 5.4 (я использую 5.3.2)
В моем случае команда перепаковки в cmd выглядела так:
D:\Unreal_Engine\UE_5.3\Engine\Build\BatchFiles\RunUAT.bat BuildPlugin -plugin="C:\Users\userPC\Downloads\MetaXRAudio\MetaXRAudio.uplugin" -package="C:\temp\MetaXRAudio"
Далее необходимо скопировать metaxraudio64.dll из загруженного плагина v67 в скомпилированный плагин под нашу версию Unreal Engine. Иначе Unreal не сможет запуститься.
Устранение предупреждения:
LogAudio: Warning: Failed to load MetaXR Reverb Submix from object path '' in MetaXRSettings. Creating 'MetaXR Reverb Submix' as stub.
После установки плагина, это поле имеет пустое значение, задайте Submix из списка.
Доп. инфо: подробный материал о плагинах звука и документации я выложу отдельной статьей:
Проблема 5. Нет звука в импортированных ассетах звуков. (Решено)
В каждом импортированном звукоке, необходимо проставить Sound Class
Так же для эффекта Пространственного аудио, необходимо задать настройку, настройку мы создаем сами, после добавления плагина Meta XR audio.
Если эффект не указывать, то аудио будет проигрываться в стерео режиме.
Проблема 6. Ошибка MOBILE PROJECTS SUPPORTING STATIC LIGHT MUST HAVE LQ LIGHTMAPS ENABLED (Решено)
Для устранения этой ошибки, необходимо включить эту настройку в Project Settings>Engine>Rendering>Support low quality lightmap shader permutatuins
Проблема 7. Устранение Warning о не поддерживании проектом XR функций. (Решено)
Warning появляются при открытии проекта и при сборке билда. Дартс является VR проектом и XR функции ему не нужны.
Для устранения этих предупреждений, необходимо отключить два плагина и убрать упоминания их в проекте по этому видео:
Проблема 8. Урок 46. Код С++ предоставленный в курсе не походит для Unreal Engine 5 из-за замены на Meta XR SDK (Не решено)
Пояснение: если вы проходите курс на Unreal Engine 4.25, у вас таких проблем не будет.
В уроке 46 нам предлагают добавить предоставленные курсом файлы в наш проект, но я получаю ошибки компиляции с++.
Я заметил в коде, что используется OVR_Platform.h, но по моему, я его не используют после перехода на Meta XR SDK.
Так же предоставленный код не компилируется в Visual Studio.
Получаю такие ошибки:
------ Building 5 action(s) started ------ 3>[1/5] Compile [x64] OculusOSS.gen.cpp 3>D:\UEProjects\OculusDarts\Source\OculusDarts\OculusOSS.h(15): error C2079: 'AOculusOSS' uses undefined class 'DARTS_API' 3>D:\UEProjects\OculusDarts\Source\OculusDarts\OculusOSS.h(15): error C2143: syntax error: missing ';' before ':' 3>D:\UEProjects\OculusDarts\Source\OculusDarts\OculusOSS.h(15): error C2059: syntax error: 'public' 3>D:\UEProjects\OculusDarts\Source\OculusDarts\OculusOSS.h(16): error C2143: syntax error: missing ';' before '{' 3>D:\UEProjects\OculusDarts\Source\OculusDarts\OculusOSS.h(16): error C2447: '{': missing function header (old-style formal list?) 3>D:\UEProjects\OculusDarts\Intermediate\Build\Win64\UnrealEditor\Inc\OculusDarts\UHT\OculusOSS.gen.cpp(17): error C2027: use of undefined type 'AOculusOSS' 3>D:\UEProjects\OculusDarts\Intermediate\Build\Win64\UnrealEditor\Inc\OculusDarts\UHT\OculusOSS.generated.h(82): note: see declaration of 'AOculusOSS' 3>D:\UEProjects\OculusDarts\Intermediate\Build\Win64\UnrealEditor\Inc\OculusDarts\UHT\OculusOSS.gen.cpp(22): error C2065: 'ThisClass': undeclared identifier 3>D:\UEProjects\OculusDarts\Intermediate\Build\Win64\UnrealEditor\Inc\OculusDarts\UHT\OculusOSS.gen.cpp(22): error C2059: syntax error: ')' 3>D:\UEProjects\OculusDarts\Intermediate\Build\Win64\UnrealEditor\Inc\OculusDarts\UHT\OculusOSS.gen.cpp(25): error C2027: use of undefined type 'AOculusOSS' 3>D:\UEProjects\OculusDarts\Intermediate\Build\Win64\UnrealEditor\Inc\OculusDarts\UHT\OculusOSS.generated.h(82): note: see declaration of 'AOculusOSS' 3>D:\UEProjects\OculusDarts\Intermediate\Build\Win64\UnrealEditor\Inc\OculusDarts\UHT\OculusOSS.gen.cpp(30): error C2065: 'ThisClass': undeclared identifier 3>D:\UEProjects\OculusDarts\Intermediate\Build\Win64\UnrealEditor\Inc\OculusDarts\UHT\OculusOSS.gen.cpp(30): error C2059: syntax error: ')' 3>D:\UEProjects\OculusDarts\Intermediate\Build\Win64\UnrealEditor\Inc\OculusDarts\UHT\OculusOSS.gen.cpp(33): error C2027: use of undefined type 'AOculusOSS' 3>D:\UEProjects\OculusDarts\Intermediate\Build\Win64\UnrealEditor\Inc\OculusDarts\UHT\OculusOSS.generated.h(82): note: see declaration of 'AOculusOSS'
chatGPT объясняет ошибки так:
Из-за отсутствия знаний c++, я пропущу сетевую часть в курсе.
Проблема 9. Урок 48. Oculus MRC. Отличие настройки на Unreal Engine 5 (Решено)
В документации Meta сказано, что Mixed Reality Capture Overview Уже интегрирован в Unreal Engine 5.
Документация Mixed Reality Capture (MRC):
Поддерживаемые видеоустройства для захвата смешанной реальности:
Проблема 10. Урок 51. Стандартный профилировщик был переименован в Unreal Insights (Unreal Engine 5) (Решено)
В уроке 51 нам показывают стандартный профилировщик Unreal Engine 4, но в Unreal engine 5 он теперь называется Unreal Insights.
Документация:
VR Profiling Tools:
Презентация возможностей Unreal Insights от Unreal Engine:
Проблема 11. Урок 51. Renderdoc 1.34-1.33 крашится, если Unreal Engine использует D3D12 (на dx11, vulkan всё нормально работает) (Решено)
В уроке мы пробуем обсчитать время вызовов Draw Call в сцене. На dx12 приложение крашится.
Решение: установить renderdoc 1.32 - https://renderdoc.org/builds
Со мной связалась поддержка Renderdoc, не знаю что он имел ввиду, но dx12 у меня установлен последней версии
Проблема 12. Warning: Asset has been saved with empty engine version (Решено)
Для устранения этих ворнингов:
1. найдите эти ассеты в проекте
2. Что-то поменяйте в нем (двинуть ноду в блюпринте)
3. Пересохраните ассет
Итог: Ворнинг пропадет.
Проблема 13. Урок 38. Создание объединенного кэша PSO немного отличается от Unreal Engine 4. (Решено)
В уроке 38, мы знакомимся с Системой кэширования PSO, но в Unreal Engine 5 сбор кэша PSO отличается.
Документация:
Пример команды cmd для сбора кэша PSO:
"D:\Unreal_Engine\UE_5.3\Engine\Binaries\Win64\UnrealEditor-Cmd.exe" D:\UEProjects\OculusDarts\OculusDarts.uproject -run=ShaderPipelineCacheTools expand D:/PSOCaching/*.rec.upipelinecache D:/PSOCaching/*.shk D:/PSOCaching/CL11122333_OculusDarts_SF_VULKAN_ES31_ANDROID.spc
Далее создайте папку PipelineCaches по такому пути: D:\UEProjects\OculusDarts\Build\Android_ASTC\PipelineCaches
Собранные в ручную PSO успешно добавлены в билд.
Немного более подробной информации о PSO Cache:
https://dev.epicgames.com/community/learning/tutorials/Pdo7/unreal-engine-5-android-pso-caching
Проблема 14. Keystore file is missing. Check the DistributionSettings section in the Android tab of Project Settings (Решено)
Для публикации Shiping APK билда в Alpha канал, необходимо сгенерировать Keystore.
Сделать можно по этому гайду:
Но для сработало по другому:
1. Зашел от имени администратора в cmd
2. Вошел в папку java cd "C:\Program Files\Java\jdk-17\bin" (зависит от вашей версии)
3. Ввел команду: keytool -genkey -v -keystore TecDevStudio.keystore -alias TecDevStudio -keyalg RSA -keysize 2048 -validity 10000
4. Сгенерированный ключ создался в папке: "C:\Program Files\Java\jdk-17\bin", скопировал его и вставил в папку проекта: "D:\UEProjects\OculusDarts\Build\Android"
5. Добавил ключ в настройках проекта:
6. Собрать Shiping Build
Проблема 14. Entitlement Check и Ачивки не сработали после выкладывания Alpha Build (Не решено)
Документация:
Я сделал всё согласно документации, но что-то не заработало(награду мне не присвоили после прохождения игры).
Я оставлю эти ссылки здесь, чтобы однажды вернуться к этой проблеме. Но в данный момент это не самая большая проблема и моей первой платформой для PC VR приложения будет Steam VR.
Выкладываем билд в Alpha Channel
Документация публикации билдов: https://developer.oculus.com/resources/publish/ https://developer.oculus.com/resources/publish-upload-overview/
Для того чтобы выложить билд, необходимо использовать Meta Quest Developer Hub.
App Distibution> выбор вашего приложения>выбираем канал загрузки билда (я загружал альфа билд)
После успешной загрузки, откройте этот канал для других пользователей:
1. Выберите канал куда загрузили приложение
2. сформируйте URL для приглашения в канал других юзеров (ссылка живет 90 дней)
3. Примените автоматическое подтверждение доступа в канал
4. Сохраните настройки канала
5. Поделитесь ссылкой с друзьями и даже собой
6. После этого увидите приложение у себя в библиотеке
7. Скачиваем и играем
Заключение
Курс "Oculus VR Production for Unreal Engine" и курс по блюпринтам, это отличное введение в VR для новичка, которые определенно нужно проходить вместе.
Далее, я планирую начать курс по C++ и если получится, начать изучать создание окружения и локаций в Unreal Engine.