Unreal Engine 5 VR
4 поста
4 поста
Введение
Видя как передвигается персонаж в таких играх как Blade And Sorcery, BoneWorks, Battle Talent, Contractors, хотелось разобраться, как и какие варианты реализации locomotion system можно реализовать в VR? Видеоуроки направленные конкретно для VR, не раскрывают как подробно реализовать продвинутое передвижение персонажа, какие сложности есть в этом.
Однажды, один пользователь на форуме unreal engine сказал примерно такие слова: "нет разницы VR это или игра от третьего лица или от первого лица, большинство механик реализуются одинаково. Разница лишь в восприятии функционала и небольших особенностях реализации." В целом, я согласен. что так оно и есть, абсолютно все механики можно адаптировать под VR, поэтому я решил адаптировать Locomotion System из проекта Lyra Unreal Engine.
Вероятно, можно просто взять и перенести логику нижней части тела персонажа из проекта Lyra и заставить это работать в VR. Но я не знал как работают анимационные слои, как разделять игровой и анимационный поток в анимационном инстансе. Поэтому я нашел вполне годные уроки.
Так же никто не запрещает взять проект ALS или GameAnimationSample от Unreal Engine (но с нуля там сложно разобраться будет).
Небольшая предыстория в коротком видео: https://www.youtube.com/shorts/phE0y7TSpLE
Из того что я нашел полезным, могу выделить два плейлиста на ютубе. Всю логику расчетов я переносил в С++.
1. Канал Outcast DevSchool имеет плейлист как с нуля воссоздать передвижение персонажа из Lyra, но он использует свой пак анимаций, который расширяет вариативность движения бедер в разных направлениях.
2. Канал Unreal Shinobi имеет похожий плейлист, использует бесплатные анимации из проекта Lyra. Но в нем было излишество для меня, автор тутора использует GamePlayTag для обозначения состояний передвижения игрока, вещь полезная но в моем случае была излишняя.
Я смотрел оба плейлиста и взял все подходящее для моего проекта.
Стоит обратить внимание на эти каналы:
LocoDev - имеет интересные туториалы по передвижению https://www.youtube.com/@LocoDev
Quinn Kuslich - Advanced Thumbstick Locomotion Tutorial конкретно на VR примере (хочется перенести отсюда VFX для телепорта) https://www.youtube.com/watch?v=KTPx8PeKyQM&t=2030s&ab_channel=QuinnKuslich
На каждое отличие я записал короткий ролик, перезаписывать видеоуроки и делать копию системы передвижения, когда там не такие большие отличия - смысла нет.
1. Используем направление камеры, а не Actor Location/Rotation. В VR в основном используют направление камеры для движения персонажа вперед. Это значит, что если ты нажал стик бежать вперед, то куда смотрит камера, туда и будем бежать. В VR камера HMD и капсула должны быть синхронизированы 1 к 1 (об этом вы должны позаботиться чтобы не было рассинхронизации). https://www.youtube.com/shorts/l9l_Nl8uBB4
2. При использовании Orientation Warping (коротко о Orientation Warping), учитываем оба случая - Движение на стик и движение физически от камеры. https://www.youtube.com/shorts/tX__fngNLZA
3. При использовании Stride Warping учитываем скорость при движении от стика и скорость получаемую от физического движения HMD (когда ходим по комнате). https://www.youtube.com/shorts/CxPJ3lQ03-w
Stride Warping позволяет динамически изменять длину шага, потому что анимации бега обычно рассчитаны на скорость 400 см/с, а для анимаций шага 200 см/с. Физический же шаг может быть индивидуальным 40-160 см/с. Демонстрация работы Stride Warping при физическом передвижении по комнате: https://www.youtube.com/shorts/Pxmgqdd03No
4. Используем Dead Blending Node, вместо INERTIALIZATION Node. Я столкнулся с проблемой, что при резкой смене анимации, происходил прыжок ошибочной позы в 1 кадр и это отстреливало в IK верхней части тела. Подробнее о проблеме в видео - https://www.youtube.com/shorts/QGK9naoeV0A
Надеюсь эта информация тебе поможет построить свою систему передвижения, под потребности проекта.
Изучая VR Expansion Plugin, я столкнулся с тем, что реализация самой Grab System написана в блюпринте персонажа в отдельных функциях, а так как у меня проект на С++ я решил просто переписать этот код на С++. Так как функций около 35 и они довольно объемные по коду, я решил поискать способ как ускорить конвертацию блюпринт кода на С++, поэтому расскажу сегодня про плагин Node to Code.
Сам репозиторий плагина находится здесь https://github.com/protospatial/NodeToCode?tab=readme-ov-file
Плагин поддерживает версии UE 5.3-5.5 скачиваем бинарник для своей версии UE - https://github.com/protospatial/NodeToCode/releases/tag/v1.2.3
Анализ Blueprint: фиксирует всю структуру графа Blueprint, включая потоки выполнения, соединения данных, ссылки на переменные и комментарии.
Несколько вариантов LLM: используйте облачные провайдеры (OpenAI, Anthropic Claude, Google Gemini, DeepSeek) или запускайте полностью локально через Ollama для полной конфиденциальности.
Эффективная сериализация: преобразует блюпринт чертежи в специальную схему JSON, которая сокращает использование токенов на 60–90 % по сравнению с подробным текстовым форматом чертежей UE.
Интегрированный редактор: просматривайте переводы в закрепляемом окне редактора Unreal с подсветкой синтаксиса, примечаниями по реализации и темами
1. Качаем плагин 2. Добываем Api ключ LLM OpenAI, Anthropic Claude, Google Gemini, DeepSeek) 3. Заходим в Project Settings>Plugins>NodeToCode> вставляем Api ключ 4. Настраиваем глубину конвертации блюпринта в С++.
Я использую глубину =1 (это значит переписать то что видно в графе блюпринта и описать функции с параметрами которые вызываются, но без их внутренней реализации).
Плагин ускорил перенос BP в С++, код требует правок, но 80% работы он выполняет отлично.
Краткий обзор от меня в коротком shorts - https://youtube.com/shorts/QJTYkJHtg74?si=5inyYPte2GyveR_Y
Телеграм канал Unreal Engine VR
🤝 Поддержать канал
В феврале, я проходил курс по С++ для Unreal Engine в контексте VR. В это же время я начал параллельно писать основу для VR проекта с нуля, но в какой то момент, понял насколько много вещей нужно учесть и протестировать, прежде чем двигаться дальше.
Я закомментировал весь написанный код и перешел на VR Expansion Plugin. В этом плагине уже решено множество проблем, как синхронизация камеры HMD и капсулы персонажа, поведение капсулы когда ты движешься физически упираешься в стену и так далее. Я до сих пор разбираю код этого плагина. Плагин поддерживает разные версии Unreal Engine. Всё доступно в репозитории бесплатно: https://github.com/mordentral/VRExpansionPlugin
Я полностью перенес код VR Expansion Plugin в свой проект, чтобы в последующем модифицировать его. Так как я базируюсь на коде этого плагина, я не буду описывать туториалы "как с нуля построить VR проект", вроде бы звучит логичным "покажи как перенести код из VR Expansion Plugin и модифицировать его", но у меня столько времени нет.
Статьи будут выходить, в статьях я буду стараться передавать модульный функционал. Показывая пример как его можно применить на простом примере. Так как контекст всех проектов разный, основываясь на моем примере вы можете применить его у себя (нейронки в помощь, грузите ей "свой контекст" и "мой пример", смотрите как можно интегрировать и надо ли оно вам вобще)
А сегодня поговорим про перевод персонажа в спринт с помощью махов рук. Такая механика применяется например в Blade and Sorcery или Battle Talent.
Функции вероятнее всего будут приложены скриншотами, а скопировать код можно будет из https://gist.github.com/8bitsage
Код этой статьи: https://gist.github.com/8bitsage/0e17f196d2114ec7d663e08a29204c5b
Идея проста: когда игрок двигается вперед и активно машет руками (как при беге), персонаж автоматически переходит в режим спринта. Это позволяет:
Освободить кнопки контроллера для других действий.
Сделать передвижение более иммерсивным.
Связать физическую активность игрока со скоростью персонажа в игре.
В заголовочном файле (h файл) класса персонажа (например, AVRPlayerCharacter.h) добавляем необходимые переменные:
// === Настраиваемые параметры ===
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement|ArmSwing",
meta = (ClampMin = "3.0", ClampMax = "15.0"))
float ArmSwingThreshold = 7.0f;
// Порог активации спринта в сантиметрах
// Определяет минимальное суммарное расстояние, которое должны пройти
// оба контроллера за один цикл проверки для активации спринта
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement|ArmSwing",
meta = (ClampMin = "0.01", ClampMax = "0.2"))
float CheckFrequency = 0.02f;
// Частота проверки движения контроллеров в секундах
// Меньшее значение = более отзывчивая механика, но больше нагрузка
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float SprintSpeed = 600.0f;
// Скорость персонажа при спринте (см/с)
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float RunSpeed = 400.0f;
// Скорость персонажа при беге (см/с)
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
float WalkSpeed = 200.0f;
// Скорость персонажа при ходьбе (см/с)
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement",
meta = (ClampMin = "0.1", ClampMax = "0.5"))
float MinStickMagnitudeForRun = 0.3f;
// Минимальное отклонение стика для перехода от ходьбы к бегу
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement",
meta = (ClampMin = "0.5", ClampMax = "0.9"))
float MinForwardRatioForSprint = 0.7f;
// Минимальная доля движения вперед для возможности спринта
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement",
meta = (ClampMin = "0.3", ClampMax = "0.7"))
float MaxLateralRatioForSprint = 0.5f;
// Максимальная доля бокового движения для возможности спринта
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement",
meta = (ClampMin = "0.1", ClampMax = "1.0"))
float BackwardSpeedMultiplier = 0.7f;
// Множитель скорости при движении назад
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement",
meta = (ClampMin = "0.1", ClampMax = "1.0"))
float SidewaysSpeedMultiplier = 0.8f;
// Множитель скорости при движении вбок
// === Внутренние переменные ===
FVector LastLeftControllerPos;
// Предыдущая позиция левого контроллера для расчета дельты
FVector LastRightControllerPos;
// Предыдущая позиция правого контроллера для расчета дельты
FTimerHandle ArmSwingTimerHandle;
// Хэндл таймера для периодической проверки движения
bool bIsArmSwinging = false;
// Флаг текущего состояния: true если игрок машет руками достаточно интенсивно
void CheckArmSwing();
void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent);
void MoveCharacter(const FInputActionValue& Value);
void HandleMovementInput(const FVector2D& InputValue);
Слабое отклонение стика (< MinStickMagnitudeForRun) — всегда ходьба, независимо от махов руками
Сильное отклонение стика (≥ MinStickMagnitudeForRun): Движение вперед (ForwardRatio > MinForwardRatioForSprint и боковое отклонение < MaxLateralRatioForSprint):С махами руками → Спринт Без махов руками → Бег Движение назад или вбок → Только бег (спринт невозможен)
Такой подход предотвращает нереалистичный спринт при движении назад или боком, делая механику более естественной. Все пороговые значения можно настроить в редакторе для точной подгонки под ваш проект.
В файле реализации (AVRPlayerCharacter.cpp) создаем функцию проверки:
Функция вызывается каждые CheckFrequency секунд (по умолчанию 0.02с = 50 раз в секунду) Настройте для оптимальной производительности.
Измеряется расстояние, пройденное каждым контроллером с последнего вызова
Если суммарное расстояние превышает ArmSwingThreshold, считается что игрок "бежит"
В методе BeginPlay() запускаем периодическую проверку:
Теперь нужно связать механику с системой ввода. Сначала настраиваем привязку action'а:
Затем реализуем функцию обработки ввода:
Важно понимать! В моем примере применение скорости персонажа в зависимости от направления взгляда камеры. Например, стик отодвинут вперед (мы бежим вперед), повернули голову на 90 градусов, мы по прежнему бежим вперед, только уже в ту сторону, когда повернулась голова.
Иногда делают реализации, когда вектор движения применяется от направления капсулы. Направление "вперед" для ввода с джойстика определяется направлением "вперед" капсулы персонажа (или его тела), а не тем, куда смотрит HMD (голова). Игрок может свободно осматриваться головой, не меняя направления движения. При этом повороты самой капсулы (тела персонажа) обычно управляются отдельно, например, правым стиком (snap turn/smooth turn) или физическим поворотом игрока, если включено bUseControllerRotationYaw для персонажа и соответствующая логика в PlayerController.
Вернемся к моему примеру. Основная логика применения скорости находится в HandleMovementInput:
Создайте новый Input Action IA_MoveCharacter
Установите Value Type: Axis2D
В Input Mapping Context привяжите к левому стику VR контроллера
Укажите персонажу Input Mapping Context
В Blueprint персонажа или в Details панели вы можете настроить все параметры:Параметры махов руками:
Arm Swing Threshold — чувствительность активации спринта (см)
Check Frequency — частота проверки движения контроллеров
Скорости движения:
Sprint Speed — скорость при спринте
Run Speed — скорость при беге
Walk Speed — скорость при ходьбе
Пороги направления:
Min Stick Magnitude For Run — минимальное отклонение стика для бега
Min Forward Ratio For Sprint — доля движения вперед для спринта
Max Lateral Ratio For Sprint — максимальная доля бокового движения для спринта
Множители скорости:
Backward Speed Multiplier — коэффициент замедления при движении назад (0.7 = 70% от обычной скорости)
Sideways Speed Multiplier — коэффициент замедления при движении вбок (0.8 = 80% от обычной скорости)
Эта механика делает передвижение в VR более естественным и погружающим. Игроку не нужно думать о кнопках — достаточно начать активнее двигать руками, как при реальном беге. Демонстрация примера показана упрощенно, модифицируйте код под конкретные нужды проекта, все ключевые параметры доступны для настройки прямо в редакторе.
При создании игр и VR-приложений одна из главных задач — это добиться естественного и реалистичного поведения персонажей. Особенно это актуально для игр с полным погружением, где игроки могут свободно передвигаться и взаимодействовать с виртуальным миром. Одной из распространенных проблем при анимации VR-персонажей является корректное размещение стоп персонажа на неровных поверхностях.
Документация всего проекта описана здесь, но изначально плагин существует для Unreal Engine 4.26:
Именно здесь на помощь приходит Power IK Ground — простой, но мощный инструмент, созданный специально для решения этой задачи. Power IK Ground — это специализированная нода (Inverse Kinematics), которая автоматически адаптирует положение ног персонажа к любым поверхностям, будь то каменистые тропинки, лестницы, наклонные плоскости или другие неровности.
Преимущества использования Power IK Ground:
Реалистичность: Стопы персонажа всегда выглядят естественно, независимо от формы поверхности.
Производительность: Power IK оптимизирован и идеально подходит даже для VR-устройств с ограниченными ресурсами, таких как Meta Quest.
Удобство: Минимальная настройка и интеграция с уже существующими анимационными системами.
Да, есть решения от Unreal Engine(Control Rig), где ты сам настраиваешь трассировку для правильной работы стопы. Меня зацепило, что автор обещает высокую производительность, а именно это мне нужно для VR проекта, поэтому я решил его использовать.
Недавно я адаптировал плагин Power IK под Unreal Engine 5.5 (за основу взял версию для UE5.2 от другого разработчика https://github.com/tornellihenrique/PowerIK-UE5.2), устранив проблемы компиляции и добавив поддержку сборки проектов под Android (Meta Quest). Также были решены проблемы полями в редакторе для указания костей где настраивается сгибание коленей персонажа.
Power IK теперь доступен в моем репозитории на GitHub, который можно свободно использовать и улучшать:
https://github.com/8bitsage/PowerIK_UE5.5
1. Скачиваем плагин с бинарниками для Unreal Engine 5.5
2. качаем zip из релизов
3. Вставляем разархивированный плагин в проект, внутри должны быть сразу файлы плагина
4. Запускаете проект и включаете плагин в Plugins. Нода Power IK Ground появится в анимационном блюпринте.
Полезные уроки, которые помогут настроить Power IK Ground:
1. Урок от автора плагина - https://www.youtube.com/watch?v=g1FgBDIA2zA&t=3s&ab_...
2. Настройка Power IK Ground от стороннего разработчика с 3:46 - https://youtu.be/PMSxTCp0kuQ?si=A5EuogPb4dmTZPeh&t=226
Вы можете посмотреть мою короткую демонстрацию работы Power IK Ground по ссылке ниже (да, у меня RU и EN каналы):
https://www.youtube.com/shorts/vWHbCahyuKw
https://www.youtube.com/shorts/6ic3Tr9NI1I
Используйте Power IK Ground, чтобы вывести свой проект на новый уровень реалистичности!
Давно ничего не писал, изучал базу С++ (до сих пор изучаю), знакомился с апи Unreal Engine, читаю книги и смотрю на реализации других авторов.
В общем всё по плану прошлой статьи. Думаю пора начать Pet-проект, а может и что-то интересное из этого выйдет.
В качестве IDE использую Rider, по-моему на нём куда стабильнее работать чем Visual Studio.
Общими вещами, механиками, я буду делиться в статьях. Чем то уникальным для проекта делиться смысла нет, иначе вроде и смысла тогда в проекте не будет..
Есть видео основанное на документе по настройке UE 5.5
https://www.youtube.com/watch?v=EClbEbNcl4k&list=LL&index=6&ab_channel=MamadouBabaei
Не забываем установить пакеты под целевую платформу Android
Доля рынка VR всё равно вышел на мобильных проектах, поэтому создавать проект буду на Meta Quest 2, 3, 3s, PRO.
Если что-то получится, можно расшириться на PICO. А еще в след году обещают выпустить мобильную гарнитуру Samsung и Steam.
Поэтому запускаю Unreal Engine 5.5.3 и выбираю:
проект Blank,
C++,
Target Platform: Mobile,
Quality Preset: Maximum
Листай ниже если не хочешь компилировать под UE 5.5MetaXRAudio компилируем под версию Unreal Engine 5.5 (если используете 5.4, то ничего делать не надо) Инструкция по компиляции плагина под движок - https://developers.meta.com/horizon/documentation/unreal/meta-xr-audio-sdk-unreal-req-setup/#repackaing-for-a-different-version-of-unreal-engine
Помещаем их в папку
Добавил папку Android из плагина версии 5.4, без него билд не собирался
Можно скачать MetaXR audio скомпилированный мной - https://drive.google.com/drive/folders/1CqixHao8yEvJhiO8BVgK8VKhBeg6Zj4m?usp=sharing
и сразу активируем его.
В папке проекта создаем папку Build (для билдов).
Создаем .gitignore для системы контроля версий (если у вас установлен Git), внутри может быть минимальный набор ограничений для Git:
.idea
.vs
*.sln
DerivedDataCache/
Intermediate/
Saved/
Binaries/
Build/
Хочется еще подобрать настройки для ПК версии, но пока нет времени.
Описание всех настроек Rendering в Unreal Engine:
[По желанию при отладке уровня] можно добавить в [/Script/Engine.RendererSettings] r.Streaming.PoolSize = 500
такое значение описано как рекомендуемое для Meta Quest (300-500 mb) О пуле потоковой передачи текстур: https://dev.epicgames.com/community/learning/knowledge-base/a3vO/unreal-engine-why-is-my-texture-streaming-pool-giving-me-a-warning
НЕ ИСПОЛЬЗУЙТЕ MOBILE HDR и MOBILE MULTI VIEW вместе! При движении камеры это вызывает ошибки рендеринга. В итоге я отказался от MOBILE HDR. Пример ошибки рендеринга в видео:
рутуб:
ютуб:
Путь - [YourProject]/Config/DefaultEngine.ini
[/Script/Engine.RendererSettings] r.Mobile.ShadingPath = 0 r.Mobile.AllowDeferredShadingOpenGL = False r.Mobile.SupportGPUScene = True r.Mobile.AntiAliasing = 3 r.Mobile.FloatPrecisionMode = 0 r.Mobile.AllowDitheredLODTransition = False r.Mobile.VirtualTextures = False r.DiscardUnusedQuality = True r.AllowOcclusionQueries = False r.MinScreenRadiusForLights = 0.050000 r.MinScreenRadiusForDepthPrepass = 0.050000 r.PrecomputedVisibilityWarning = False r.TextureStreaming = True Compat.UseDXT5NormalMaps = False r.VirtualTextures = False r.VT.EnableAutoImport = False r.VirtualTexturedLightmaps = False r.VT.AnisotropicFiltering = False bEnableVirtualTextureOpacityMask = False bEnableVirtualTexturePostProcessing = False r.VT.TileSize = 128 r.VT.TileBorderSize = 4 r.vt.FeedbackFactor = 16 r.MeshPaintVirtualTexture.TileSize = 32 r.MeshPaintVirtualTexture.TileBorderSize = 2 r.MeshPaintVirtualTexture.UseCompression = False r.StaticMesh.DefaultMeshPaintTextureSupport = False r.MeshPaintVirtualTexture.DefaultTexelsPerVertex = 4 r.MeshPaintVirtualTexture.MaxTextureSize = 4096 r.vt.rvt.EnableBaseColor = True r.vt.rvt.EnableBaseColorRoughness = True r.vt.rvt.EnableBaseColorSpecular = True r.vt.rvt.EnableMask4 = True r.vt.rvt.EnableWorldHeight = True r.vt.rvt.EnableDisplacement = True r.vt.rvt.HighQualityPerPixelHeight = True WorkingColorSpaceChoice = sRGB RedChromaticityCoordinate = (X=0.640000,Y=0.330000) GreenChromaticityCoordinate = (X=0.300000,Y=0.600000) BlueChromaticityCoordinate = (X=0.150000,Y=0.060000) WhiteChromaticityCoordinate = (X=0.312700,Y=0.329000) r.LegacyLuminanceFactors = False r.ClearCoatNormal = False r.DynamicGlobalIlluminationMethod = 0 r.ReflectionMethod = 0 r.ReflectionCaptureResolution = 128 r.ReflectionEnvironmentLightmapMixBasedOnRoughness = True r.Lumen.HardwareRayTracing = False r.Lumen.HardwareRayTracing.LightingMode = 0 r.Lumen.TranslucencyReflections.FrontLayer.EnableForProject = False r.Lumen.TraceMeshSDFs = 1 r.Lumen.ScreenTracingSource = 0 r.Lumen.Reflections.HardwareRayTracing.Translucent.Refraction.EnableForProject = False r.MegaLights.EnableForProject = False r.RayTracing.Shadows = False r.Shadow\.Virtual.Enable = 0 r.RayTracing = False r.RayTracing.UseTextureLod = False r.PathTracing = False r.GenerateMeshDistanceFields = False r.DistanceFields.DefaultVoxelDensity = 0.200000 r.Nanite.ProjectEnabled = False r.AllowStaticLighting = True r.NormalMapsForStaticLighting = True r.ForwardShading = True r.VertexFoggingForOpaque = False r.SeparateTranslucency = False r.TranslucentSortPolicy = 0 TranslucentSortAxis = (X=0.000000,Y=-1.000000,Z=0.000000) r.LocalFogVolume.ApplyOnTranslucent = False xr.VRS.FoveationLevel = 3 xr.VRS.DynamicFoveation = False r.CustomDepth = 1 r.CustomDepthTemporalAAJitter = False r.PostProcessing.PropagateAlpha = False r.Deferred.SupportPrimitiveAlphaHoldout = False r.DefaultFeature.Bloom = True r.DefaultFeature.AmbientOcclusion = False r.DefaultFeature.AmbientOcclusionStaticFraction = False r.DefaultFeature.AutoExposure = False r.DefaultFeature.AutoExposure.Method = 2 r.DefaultFeature.AutoExposure.Bias = 1.000000 r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange = True r.DefaultFeature.LocalExposure.HighlightContrastScale = 0.800000 r.DefaultFeature.LocalExposure.ShadowContrastScale = 0.800000 r.DefaultFeature.MotionBlur = False r.DefaultFeature.LensFlare = False r.AntiAliasingMethod = 0 r.TemporalAA.Upsampling = False r.MSAACount = 4 r.DefaultFeature.LightUnits = 1 r.DefaultBackBufferPixelFormat = 4 r.ScreenPercentage.Default = 100.000000 r.ScreenPercentage.Default.Desktop.Mode = 1 r.ScreenPercentage.Default.Mobile.Mode = 0 r.ScreenPercentage.Default.VR.Mode = 0 r.ScreenPercentage.Default.PathTracer.Mode = 0 r.Shadow\.UnbuiltPreviewInGame = False r.StencilForLODDither = False r.EarlyZPass = 3 r.EarlyZPassOnlyMaterialMasking = False r.Shadow\.CSMCaching = True r.DBuffer = False r.ClearSceneMethod = 1 r.VelocityOutputPass = 0 r.Velocity.EnableVertexDeformation = 2 r.SelectiveBasePassOutputs = False bDefaultParticleCutouts = False fx.GPUSimulationTextureSizeX = 1024 fx.GPUSimulationTextureSizeY = 1024 r.AllowGlobalClipPlane = False r.GBufferFormat = 1 r.MorphTarget.Mode = True r.MorphTarget.MaxBlendWeight = 5.000000 r.SupportSkyAtmosphere = True r.SupportSkyAtmosphereAffectsHeightFog = True r.SupportExpFogMatchesVolumetricFog = False r.SupportLocalFogVolumes = True r.SupportCloudShadowOnForwardLitTranslucent = False r.LightFunctionAtlas.Format = 0 r.VolumetricFog.LightFunction = False r.Deferred.UsesLightFunctionAtlas = False r.SingleLayerWater.UsesLightFunctionAtlas = False r.Translucent.UsesLightFunctionAtlas = False r.Translucent.UsesIESProfiles = False r.Translucent.UsesRectLights = False r.GPUCrashDebugging = False vr.InstancedStereo = True r.MobileHDR = False vr.MobileMultiView = True r.Mobile.UseHWsRGBEncoding = True vr.RoundRobinOcclusion = False r.MeshStreaming = False r.HeterogeneousVolumes = False r.HeterogeneousVolumes.Shadows = False r.Translucency.HeterogeneousVolumes = False r.WireframeCullThreshold = 5.000000 r.SupportStationarySkylight = True r.SupportLowQualityLightmaps = True r.SupportPointLightWholeSceneShadows = True r.Shadow\.TranslucentPerObject.ProjectEnabled = False r.Water.SingleLayerWater.SupportCloudShadow = False r.Substrate = False r.Substrate.OpaqueMaterialRoughRefraction = True r.Refraction.Blur = True r.Substrate.Debug.AdvancedVisualizationShaders = False r.Material.RoughDiffuse = False r.Material.EnergyConservation = False r.Material.DefaultAutoMaterialUsage = True r.OIT.SortedPixels = False r.HairStrands.LODMode = False r.SkinCache.CompileShaders = True r.VRS.Support = True r.SkinCache.SkipCompilingGPUSkinVF = False r.SkinCache.DefaultBehavior = 1 r.SkinCache.SceneMemoryLimitInMB = 128.000000 r.Mobile.EnableStaticAndCSMShadowReceivers = False r.Mobile.EnableMovableLightCSMShaderCulling = True r.Mobile.Forward.EnableLocalLights = 1 r.Mobile.Forward.EnableClusteredReflections = False r.Mobile.AllowDistanceFieldShadows = False r.Mobile.EnableMovableSpotlightsShadow = False r.GPUSkin.Support16BitBoneIndex = False r.GPUSkin.Limit2BoneInfluences = False r.SupportDepthOnlyIndexBuffers = False r.SupportReversedIndexBuffers = False r.Mobile.AmbientOcclusion = False r.Mobile.DBuffer = False r.GPUSkin.UnlimitedBoneInfluences = False r.GPUSkin.AlwaysUseDeformerForUnlimitedBoneInfluences = False r.GPUSkin.UnlimitedBoneInfluencesThreshold = 8 DefaultBoneInfluenceLimit = (Default=0,PerPlatform=()) MaxSkinBones = (Default=65536,PerPlatform=(("Mobile", 256))) r.Mobile.PlanarReflectionMode = 0 r.Mobile.ScreenSpaceReflections = False r.Mobile.SupportsGen4TAA = False bStreamSkeletalMeshLODs = (Default=False,PerPlatform=()) bDiscardSkeletalMeshOptionalLODs = (Default=False,PerPlatform=()) VisualizeCalibrationColorMaterialPath = /Engine/EngineMaterials/PPM\_DefaultCalibrationColor.PPM\_DefaultCalibrationColor VisualizeCalibrationCustomMaterialPath = None VisualizeCalibrationGrayscaleMaterialPath = /Engine/EngineMaterials/PPM\_DefaultCalibrationGrayscale.PPM\_DefaultCalibrationGrayscale r.AllowGlobalClipPlane = False
Прописываем Описание проекта в настройках, чтобы эта запись была внутри каждого .h файла. Она будет уникальна для Вашего проекта.
С такими настройками мне успешно удалось собрать apk для Meta Quest и запустить его на шлеме.
Ранее было популярно открывать дебетовые карты в Казахстане, но с января 2025 года банки урезают такую возможность без наличия прописки, а то и вовсе открывают счета всего на 1 год.Пока гайки закручиваются, решил я открыть карту в Кыргызстане.Без регистрационного талона, возможно открыть только в двух банках:- Бакай Банк- Банк «Бай-Tушум»В принципе открыть можно за 3 дня, но пишут что у кого-то на 5 дней растягивалось. Я приезжал на 6 дней.
1. самолет из МСК > Кыргызстан(Бишкек) > МСК - 30000 руб
2. Жилье 6 ночей в отеле - 25000 руб (бронируй и оплачивай через OZON путешествия)
3. Еда в день на человека 1500 руб.
4. Такси, примерно 4000 руб на всё время пребывания.Итого: 66000 руб
1. Оформляешь симку оператора MEGA в аэропорту у выхода на РФ паспорт.2. Для того чтобы симка не отлетела через месяц. Регаешь IMEI телефона в которой будешь использовать симку на сайте https://www.imei.kg
Оплатить регистрацию IMEI можно через кого то у кого есть MEGAPay, Balance или деньги О! ЛИБО в офлайн точке imei.kg (я так делал по адресу: проспект Чуй, 204, Бишкек Берекет-Гранд, точка регистрации IMEI находится на лестнице в проходе на втором этаже)
Всё, оплатили, зарегали, симка останется на всегда, если будешь отправлять смс раз в 90-180 дней (точно мне никто не сказал)
БАКАЙ БАНК
Головной офис: Кыргызская Республика г. Бишкек, ул. Тыныстанова 166
Документы:
- Паспорт РФ
- Паспорт Загран
- Посадочный талон самолета
Открываешь счет на РФ номер.+ просишь открыть счет в сомах прикрепленный к долларовому счету.
Обслуживание и срочный выпуск карты обошелся в $32 (рубли сразу поменяют на баксы в счет оплаты комиссий и обслуживания)Получишь карту в течении 2х дней.
Пополняешь через сбер или Т-банк переводом по номеру телефона в Кыргызстан(либо по номеру карты).
2. Банк «Бай-Tушум»
Адрес: Уметалиева, 76
Документы:
- Паспорт РФ
- Паспорт Загран
- Посадочный талон самолета
-Российский ИНН
Открываешь сразу VISA GOLD и Карту Элкарт (для пополнения из РФ) ТУТ ОТКРЫВАЮТ ТОЛЬКО НА КЫРГЫЗСКИЙ НОМЕР ТЕЛЕФОНА
Открытие Visa обошлось в $10
Открытие Элкарт обошлось в 200 сом
Просите открывать мобильный банк чтобы управлять счетами дистанционно.
Получишь карты через 2 дня.
О! Деньги:
Любой отдел на яндекс картах. Тут можно верифицировать себя как нерезидента без наличия регистрационного талона. Они позволяют открывать ВИРТУАЛЬНЫЕ карты VISA (KZT, USD, EUR, KGS)
Но тут уже не знаю, пройдет она где то или нет в зарубежных сервисах.
По поводу регистрационного талона (он нужен для других банков, я себе не делал). Я пытался его сделать через отель, но у отеля не было ЕНИ-кода (код на имущество недвижимости).
В целом суть такая:
- Просишь ходатайство на то что ты проживаешь по адресу с ДАТЫ по ДАТУ. Там пишут твой паспорт и печать организации где живешь. Обязательно ЕНИ-код должен быть.
- Если получилось это оформить, едешь в ЦОН района, где тебя временно указали в ходатайстве. Встаешь в очередь и там тебе дают регистрационный талон. С регистрационным талоном можно открывать счета в других банках типа: Finca bank, Demir и другие. Но мне этого не надо.
Получив карты, регаешь эти иностранные счета в личном кабинете налоговой.
❗️Если соберетесь что-то делать по моему опыту, переспросите в чатах банков, не изменились ли условия выдачи карт.
После успешного завершения мини игры Darts VR, нужно разобраться, что делать дальше и в каком порядке. Но в целом, у меня сформировался план развития, чтобы в итоге приблизиться к VR демо.
Ссылки пришлось вставить в текст, потому что ссылки на плейлисты ютуба не дает вставить.
Мне нужен С++ чтобы в будущем работать в команде. Изменения в блюпринтах не показываются в коммитах git.
Мне нужно научиться применять С++ в Unreal Engine , особенно для проектов VR.
Мне нужно больше знаний о Level Design, а еще лучше, для игр от первого лица.
Для изучения синтаксиса я выбрал эти плейлисты. Где-то информация одинаковая, но где то свои особенные задания или лайфхаки применения языка.
(Курс я еще не выложил но обязательно вставлю сюда ссылку)
Для практики С++ я уже придумал себе задачу написать скрипт, который будет сравнивать данные из csv и json. Это мне нужно для работы.
Если всё получится, прикреплю сюда ссылку на проект в github (Вставлю ссылку сюда).
Надеюсь после прохождения этих курсов, я смогу двинуться по VR дальше и это уже будет более понятной мне областью. Информацию по VR, я так же коплю и выкладываю в телеграм канале.
Эта статья будет посвящена завершению прохождения курса "Oculus VR Production for Unreal Engine". В этой статье я расскажу, какие проблемы я встретил при прохождении курса, и как я решал эти проблемы.
Так же я завершил проходить курс по блюпринтам, благодаря ему, я стал лучше понимать как работать с блюпринтами.
Из-за ограничений платформ на которые мы разрабатываем продукт, визуальное отображение будет меняться.
Для того чтобы видеть, как игра будет выглядеть в шлеме Meta Quest, необходимо включить превью Android Vulkan Mobile:
Settings>Preview Platform>Android Vulkan Mobile
После компиляции шейдеров, появится иконка Андроид слева от запуска сцены. Таким образом, можно будет переключать Preview Platform.
В уроке 38 мы делаем пробный билд игры. У меня билд не собирался, из-за ошибок редиректа.
Изучив проблему, я понял, что копируя и перенося некоторые блюпринты и объекты, создавались файлы ссылок на старое местонахождение этих объектов. Избавляться от них, надо с помощью Fix Up Redirectors.
Гайд по применению Fix Up Redirectors:
После фикса редиректов, сборка проекта успешно была завершена.
Необходимо отключить Online Subsystem Oculus, так как вместо него используются плагин Meta XR.
После смены плагина на Meta XR, необходимо заменить функцию проверки собственности на игру.
При запуске игры на Meta Quest 3, падает такой лог:
Так же падает Unreal Engine при запуске игры в режиме Android Vulkan Mobile (получается, предтестовый запуск Vulkan Mobile можно делать локально, Он будет соответствовать запуску на VR шлеме)
LoginId:615e6279457b63b6d363f1b7360a3162 EpicAccountId:680cd586d6834a7ab5167e3ae83ba308 Assertion failed: !ScreenTexture.Texture->Desc.IsTextureArray() [File:D:\build\++UE5\Sync\Engine\Source\Runtime\Renderer\Private\ScreenPass.cpp] [Line: 83] UnrealEditor_Renderer!AddMobilePostProcessingPasses()
Я создал новый шаблон 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.UnyINLm2fBWMABoneInfluences=False
r.GPUSkin.UnyINLm2fBWMABoneInfluencesThreshold=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
В уроке 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 из списка.
Доп. инфо: подробный материал о плагинах звука и документации я выложу отдельной статьей - Meta XR Audio и MetaSounds в Unreal Engine 5 & VR
В каждом импортированном звукоке, необходимо проставить Sound Class
Так же для эффекта Пространственного аудио, необходимо задать настройку, настройку мы создаем сами, после добавления плагина Meta XR audio.
Если эффект не указывать, то аудио будет проигрываться в стерео режиме.
Для устранения этой ошибки, необходимо включить эту настройку в Project Settings>Engine>Rendering>Support low quality lightmap shader permutatuins
Warning появляются при открытии проекта и при сборке билда. Дартс является VR проектом и XR функции ему не нужны.
Для устранения этих предупреждений, необходимо отключить два плагина и убрать упоминания их в проекте по этому видео:
Пояснение: если вы проходите курс на 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'
Из-за отсутствия знаний c++, я пропущу сетевую часть в курсе.
В документации Meta сказано, что Mixed Reality Capture Overview Уже интегрирован в Unreal Engine 5.
Документация Mixed Reality Capture (MRC):
Поддерживаемые видеоустройства для захвата смешанной реальности:
В уроке 51 нам показывают стандартный профилировщик Unreal Engine 4, но в Unreal engine 5 он теперь называется Unreal Insights.
Документация:
VR Profiling Tools:
Презентация возможностей Unreal Insights от Unreal Engine
В уроке мы пробуем обсчитать время вызовов Draw Call в сцене. На dx12 приложение крашится.
Решение: установить renderdoc 1.32 - https://renderdoc.org/builds
Со мной связалась поддержка Renderdoc, не знаю что он имел ввиду, но dx12 у меня установлен последней версии
Для устранения этих ворнингов:
1. найдите эти ассеты в проекте
2. Что-то поменяйте в нем (двинуть ноду в блюпринте)
3. Пересохраните ассет
Ворнинг пропадет.
В уроке 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 успешно добавлены в билд.
Для публикации 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
Документация:
Я сделал всё согласно документации, но что-то не заработало(награду мне не присвоили после прохождения игры).
Я оставлю эти ссылки здесь, чтобы однажды вернуться к этой проблеме. Но в данный момент это не самая большая проблема и моей первой платформой для PC VR приложения будет Steam VR.
Документация публикации билдов: 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.