In the player class constructor, I use ConstructorHelpers::FObjectFinder to get a link to blueprint animation class:
static ConstructorHelpers::FObjectFinder<UAnimBlueprint> finderAnim(TEXT("AnimBlueprint'/Game/MixamoAnimPack/Mixamo_Adam/Anims/MixamoAnimBP_Adam.MixamoAnimBP_Adam'"));
Then I call SetAnimClass() method:
if (finderAnim.Succeeded())
PlayerMesh->SetAnimClass(finderAnim.Object->GetAnimBlueprintGeneratedClass());
Everything works in the UE4 editor, but when I started packing the project, something went wrong and I got an error:
> PackagingResults: Warning: Error: CDO Constructor (Enemy): Failed to find /Game/MixamoAnimPack/Mixamo_Mortimer/Anims/MixamoAnimBP_Mortimer.MixamoAnimBP_Mortimer
Is there a solution to this problem or I should create a blueprint class of the player and choose the animation there?
asked Jun 3, 2020 at 14:18
0
Here is a similar question on Unreal Engine’s Forum.
This is the proposed solution:
Adding «_C» at the end of filename and treating the file as a «UClass»
makes things run smoother. Now it runs properly on both editor and
packaged game.
So your initialization of finderAnim
will look like:
static ConstructorHelpers::FObjectFinder<UClass> finderAnim(TEXT("AnimBlueprint'/Game/MixamoAnimPack/Mixamo_Adam/Anims/MixamoAnimBP_Adam.MixamoAnimBP_Adam_C'"));
PS: Go through JamesG’s (Lead Programmer — UE4 Animation/Physics/Audio Team) answer on this thread to understand it more clearly.
answered Jun 3, 2020 at 15:01
brc-ddbrc-dd
9,2413 gold badges37 silver badges62 bronze badges
1
Another possibly more robust solution is to use FClassFinder
.
static ConstructorHelpers::FClassFinder<UAnimInstance> finderAnim(TEXT("/Game/MixamoAnimPack/Mixamo_Adam/Anims/MixamoAnimBP_Adam"));
after which you can simply
PlayerMesh->SetAnimClass(finderAnim.Class);
answered Jun 3, 2020 at 19:48
RotemRotem
21.2k6 gold badges62 silver badges109 bronze badges
Оригинальный автор: @ Dong Xuan Wong
связанная информация:
C ++ понимает проблему динамической загрузки: LoadClass <T> () и LoadObject <T> ()
http://aigo.iteye.com/blog/2281558
C ++ реализует динамическую загрузку UObject: StaticLoadObject (); взять в качестве примеров текстуру и материал
http://aigo.iteye.com/blog/2268056
Упомянутая здесь статическая загрузка относится к методу загрузки, который должен быть завершен в конструкторе. Значение динамической загрузки может быть загружено во время выполнения. В исходном коде UE4 первый фактически является слоем инкапсуляции для второго, а именноFObjectFinder () является инкапсуляцией LoadObject ()。But,FClassFinder () не является инкапсуляцией LoadClass (),FClassFinder () внутренне вызывает LoadObject ().
Если вы хотите получить класс типа чертежа БП, вы можете получить его через ConstructorHelpers :: FClassFinder (), например:
static ConstructorHelpers::FClassFinder<AActor> UnitSelector(TEXT("Blueprint'/Game/MyProject/MyBlueprint.MyBlueprint'"));
TSubclassOf<AActor> UnitSelectorClass = UnitSelector.Class;
Но при запуске игры сообщается об ошибке, что файл не может быть найден, например:
Default property warnings and errors:
Error: COD Constructor (MyGameMode): Failed to find /Game/MyProject/MyBlueprint.MyBlueprint
Есть два решения (это яма UE4, он меня долго тратит …):
А, вcopy referenceДобавить после пути к файлу_C,Например:Blueprint’/Game/Blueprints/MyBlueprint.MyBlueprint_C‘
static ConstructorHelpers::FClassFinder<AActor> UnitSelector(TEXT("Blueprint'/Game/Blueprints/MyBlueprint.MyBlueprint_C'"));
TSubclassOf<AActor> UnitSelectorClass = UnitSelector.Class;
B, удалите префикс пути:/Game/Blueprints/MyBlueprint
static ConstructorHelpers::FClassFinder<AActor> UnitSelector(TEXT("/Game/Blueprints/MyBlueprint"));
TSubclassOf<AActor> UnitSelectorClass = UnitSelector.Class;
Также обратите внимание: имя шаблона FClassFinder <T>,Невозможно написать UBlueprint напрямую,Например:FClassFinder<UBlueprint> Это неправильно.Какой родительский класс выбран при создании проекта, напишите имя соответствующего родительского класса, Если это Актёр, то это должно быть записано как:FClassFinder<AActor>, иначе он не может быть успешно загружен.
При использовании TSubclassOf <T>Название шаблона должно быть таким же
К тому же,Имя шаблона в функции FClassFinder <T> () должно совпадать с именем шаблона переменной TSubclassOf <T>.Например, вышеупомянутые все AActors, если они не совпадают, вышеупомянутая ошибка также произойдет.
Приведите другой пример:
static ConstructorHelpers::FClassFinder<UUserWidget> TestBP(TEXT("/Game/Blueprints/MyWidget_BP"));
TSubclassOf<UUserWidget> MyWidgetClass = TestBP.Class;
Вы также можете использовать UClass * для замены TSubclassOf <T>
Например:
static ConstructorHelpers::FClassFinder<UUserWidget> TestBP(TEXT("/Game/Blueprints/MyWidget_BP"));
UClass* MyWidgetClass = TestBP.Class;
Я видел много примеров черезFObjectFinder()Чтобы получить этот класс, сейчас думать об этом беспомощно. Документация по UE4 довольно скудна. Не только документация проекта не обновляется синхронно, но и документация C ++ жалкая.
static ConstructorHelpers::FObjectFinder<UBlueprint> UnitSelector(TEXT("Blueprint'/Game/MyProject/MyBlueprint.MyBlueprint'"));
TSubclassOf<AActor> UnitSelectorClass = (UClass*)UnitSelector.Object->GeneratedClass;
Другие ссылки:
CDO Constructor: Failed to find Blueprint
https://answers.unrealengine.com/questions/84880/cdo-constructor-failed-to-find-blueprint-ue-44.html
В конструкторе класса проигрывателя я использую ConstructorHelpers :: FObjectFinder, чтобы получить ссылку на класс анимации проекта:
static ConstructorHelpers::FObjectFinder<UAnimBlueprint> finderAnim(TEXT("AnimBlueprint'/Game/MixamoAnimPack/Mixamo_Adam/Anims/MixamoAnimBP_Adam.MixamoAnimBP_Adam'"));
Затем я вызываю метод SetAnimClass ():
if (finderAnim.Succeeded())
PlayerMesh->SetAnimClass(finderAnim.Object->GetAnimBlueprintGeneratedClass());
Все работает в редакторе UE4, но когда я начал упаковывать проект, что-то пошло не так, и я получил ошибку:
> PackagingResults: Warning: Error: CDO Constructor (Enemy): Failed to find /Game/MixamoAnimPack/Mixamo_Mortimer/Anims/MixamoAnimBP_Mortimer.MixamoAnimBP_Mortimer
Есть решение этой проблемы, или я должен создать класс проекта игрока и выбрать там анимацию?
2 ответа
Лучший ответ
Здесь похожий вопрос на форуме Unreal Engine.
Это предлагаемое решение:
Добавление «_C» в конце имени файла и обработка файла как «UClass» делает работу более гладкой. Теперь он работает правильно как в редакторе, так и в упакованной игре.
Таким образом, ваша инициализация finderAnim
будет выглядеть так:
static ConstructorHelpers::FObjectFinder<UClass> finderAnim(TEXT("AnimBlueprint'/Game/MixamoAnimPack/Mixamo_Adam/Anims/MixamoAnimBP_Adam.MixamoAnimBP_Adam_C'"));
PS: Пройдите через ответ Джеймса (Ведущий программист — UE4 Animation / Physics / Audio Team) на этот поток, чтобы понять его более четко.
1
brc-dd
3 Июн 2020 в 15:16
Другое, возможно, более надежное решение — использовать FClassFinder
.
static ConstructorHelpers::FClassFinder<UAnimInstance> finderAnim(TEXT("/Game/MixamoAnimPack/Mixamo_Adam/Anims/MixamoAnimBP_Adam"));
После чего вы можете просто
PlayerMesh->SetAnimClass(finderAnim.Class);
0
Rotem
3 Июн 2020 в 19:48
I’m trying to get started developing for the Quest 2 on my Mac. I’m new to Android, UE4 and the Oculus Quest 2.
I’ve followed the instructions to build the Oculus fork of UE4 from source, installed Android Studio and set things up.
I did have to modify the UE4 source to get it to compile. See PR #108 to github.com/Oculus-VR/UnrealEngine/pull/108 (I’m not allowed to post proper links yet). I also had an issue with a type -P command in SetupAndroid.command failing because the default Mac shell zsh doesn’t appear to support the -P option to type. The two things make me wonder if developing on a Mac is actively being supported?
I have been able to build the sample template project in UE4.
LogPlayLevel: Running: /Users/erland/Library/Android/sdk/platform-tools/adb -s <serial> shell am start -n com.YourCompany.QuestOS/com.epicgames.ue4.GameActivity
LogPlayLevel: Starting: Intent { cmp=com.YourCompany.QuestOS/com.epicgames.ue4.GameActivity }
In the headset I first see the three dots, and then just a «black» world.
At some point during troubleshooting, I got some messages indicating the .obb file was not found, and download of it was starting which might have
I’m running Android Studio 3.6.3, UE 4.25 from source, MacOS 10.15.7, XCode 12.4, Oculus VR Plugin version 1.55.0.
Manually starting the code using adb shell, then «am start -n com.YourCompany.QuestOS/com.epicgames.ue4.GameActivity» and then «logcat«, I get the following
02-15 10:49:56.447 9320 9354 D UE4 : [2021.02.15-09.49.56:447][ 0]LogStreaming: Error: Couldn’t find file for package /OculusVR/Materials/PokeAHoleMaterial requested by async loading code. NameToLoad: /OculusVR/Materials/PokeAHoleMaterial
02-15 10:49:56.447 9320 9354 D UE4 : [2021.02.15-09.49.56:447][ 0]LogStreaming: Error: Found 0 dependent packages…
02-15 10:49:56.448 9320 9354 D UE4 : CDO Constructor (OculusResourceHolder): Failed to find /OculusVR/Materials/PokeAHoleMaterial
02-15 10:49:56.448 9320 9354 D UE4 : [2021.02.15-09.49.56:448][ 0]Error: CDO Constructor (OculusResourceHolder): Failed to find /OculusVR/Materials/PokeAHoleMaterial
02-15 10:49:56.448 9320 9354 D UE4 :
02-15 10:49:56.448 9320 9354 D UE4 : [2021.02.15-09.49.56:448][ 0]LogHMD: Error: Unable to load PokeAHoleMaterial
02-15 10:49:56.449 9320 9354 D UE4 : [2021.02.15-09.49.56:449][ 0]LogStreaming: Error: Couldn’t find file for package /OculusVR/Materials/OculusMR_ChromaKey requested by async loading code. NameToLoad: /OculusVR/Materials/OculusMR_ChromaKey
02-15 10:49:56.449 9320 9354 D UE4 : [2021.02.15-09.49.56:449][ 0]LogStreaming: Error: Found 0 dependent packages…
02-15 10:49:56.450 9320 9354 D UE4 : [2021.02.15-09.49.56:450][ 0]LogUObjectGlobals: Warning: Failed to find object ‘Material None./OculusVR/Materials/OculusMR_ChromaKey’
02-15 10:49:56.450 9320 9354 D UE4 : [2021.02.15-09.49.56:450][ 0]LogMR: Warning: Invalid ChromaKeyMaterial
02-15 10:49:56.450 9320 9354 D UE4 : [2021.02.15-09.49.56:450][ 0]LogStreaming: Error: Couldn’t find file for package /OculusVR/Materials/OculusMR_OpaqueColoredMaterial requested by async loading code. NameToLoad: /OculusVR/Materials/OculusMR_OpaqueColoredMaterial
02-15 10:49:56.450 9320 9354 D UE4 : [2021.02.15-09.49.56:450][ 0]LogStreaming: Error: Found 0 dependent packages…
02-15 10:49:56.451 9320 9354 D UE4 : [2021.02.15-09.49.56:451][ 0]LogUObjectGlobals: Warning: Failed to find object ‘Material None./OculusVR/Materials/OculusMR_OpaqueColoredMaterial’
02-15 10:49:56.451 9320 9354 D UE4 : [2021.02.15-09.49.56:451][ 0]LogMR: Warning: Invalid OpaqueColoredMaterial
02-15 10:49:56.500 9320 9354 D UE4 : [2021.02.15-09.49.56:500][ 0]LogAudioCaptureCore: Display: No Audio Capture implementations found. Audio input will be silent.
02-15 10:49:56.501 9320 9354 D UE4 : [2021.02.15-09.49.56:500][ 0]LogAudioCaptureCore: Display: No Audio Capture implementations found. Audio input will be silent.
02-15 10:49:56.516 737 737 E WifiHAL : handleResponse: OTHER_RX_MULTICAST_CNT not found
02-15 10:49:56.521 737 737 E WifiHAL : wifi_get_ring_data: Error -5 happened.
02-15 10:49:56.521 1026 3833 E WifiVendorHal: getRingBufferData(l.1675) failed {.code = ERROR_INVALID_ARGS, .description = }
02-15 10:49:56.555 1026 3833 D wifi-jni: no kernel logs
02-15 10:49:56.595 9320 9354 D UE4 : [2021.02.15-09.49.56:595][ 0]LogAISub: UAISubsystem AISubsystem (0x9f344160), frame # 0
02-15 10:49:56.596 9320 9354 D UE4 : [2021.02.15-09.49.56:596][ 0]LogAISub: UAISubsystem AIPerceptionSystem (0xc5893b00), frame # 0
02-15 10:49:56.599 9320 9354 D UE4 : [2021.02.15-09.49.56:599][ 0]LogAISub: UAISubsystem EnvQueryManager (0x9ff25100), frame # 0
02-15 10:49:56.601 688 9526 E ResolverController: No valid NAT64 prefix (100, <unspecified>/0)
02-15 10:49:56.609 688 9528 E ResolverController: No valid NAT64 prefix (100, <unspecified>/0)
02-15 10:49:56.616 688 9530 E ResolverController: No valid NAT64 prefix (100, <unspecified>/0)
02-15 10:49:56.616 9320 9354 D UE4 : [2021.02.15-09.49.56:616][ 0]LogUObjectBase: Warning: ————— Default Property warnings and errors:
02-15 10:49:56.616 9320 9354 D UE4 : [2021.02.15-09.49.56:616][ 0]LogUObjectBase: Warning: Error: CDO Constructor (OculusResourceHolder): Failed to find /OculusVR/Materials/PokeAHoleMaterial
02-15 10:49:56.616 9320 9354 D UE4 :
I think perhaps the PokeAHoleMaterial is related to the OculusVR Plugin in UE4. I have enabled the plugin, but the plugin is not showing up under «Plugins» in the project settings. I saw a post saying to add the /OculusVR/Materials to the «Additional Asset Directories to Cook». But there is no «/OculusVR/Materials» that can be selected, and I’m wondering if this is due to the plugin not working completely?