Closed hyaguchi947d closed 3 months ago
動作確認環境 UE5.4.3, VS2022, WIndows11 VRM4U_5_4_20240728
状況としましては、 UEのエディタ上では正常に動作していますが、 パッケージ化した場合にランタイムロードしたVRMのMorphTargetが反映されていません。 OptionDataのSkipMorphTargetがtrueの時と同様の挙動に見えます。
該当箇所は VRM4ULoader/Private/VRMConverterMorphTarget.cpp VRMConverter::ConvertMorphTarget() と思われ、たどっていくと終盤の
#if UE_VERSION_OLDER_THAN(5,4,0) sk->GetResourceForRendering()->LODRenderData[0].InitResources(false, 0, VRMGetMorphTargets(sk), sk); #else #if WITH_EDITOR sk->GetResourceForRendering()->LODRenderData[0].InitResources(false, 0, VRMGetMorphTargets(sk), sk); #endif #endif
の部分、5.4以降の非エディタ環境ではこれに相当する処理が行われていませんでした。 試しにWITH_EDITORの中身を常に有効にしたところ、コンパイル時に次のエラーになりました。
C2664 'void FSkeletalMeshLODRenderData::InitResources(bool,int32,TArray<UMorphTarget *,TSizedDefaultAllocator<32>> &,USkinnedAsset *)': 引数 3 を 'TArray<TObjectPtr<UMorphTarget>,FDefaultAllocator>' から 'TArray<UMorphTarget *,TSizedDefaultAllocator<32>> &' へ変換できません。
これはTArrayの中の型がTObjectPtrか生ポインタかの違いでしたので、 次のような回避策をとったところ、こちらの環境ではコンパイルも通り、MorphTargetも正常に反映されています。
#if WITH_EDITOR sk->GetResourceForRendering()->LODRenderData[0].InitResources(false, 0, VRMGetMorphTargets(sk), sk); #else TArray<UMorphTarget*> morphtargets; for (auto morphtarget : VRMGetMorphTargets(sk)) { morphtargets.Add(morphtarget); } sk->GetResourceForRendering()->LODRenderData[0].InitResources(false, 0, morphtargets, sk); #endif
以上、ご確認いただけますと幸いです。
ソースまで追っていただいてありがとうございます! 手元でも問題を確認、修正できました。リポジトリに反映しました。
動作確認環境 UE5.4.3, VS2022, WIndows11 VRM4U_5_4_20240728
状況としましては、 UEのエディタ上では正常に動作していますが、 パッケージ化した場合にランタイムロードしたVRMのMorphTargetが反映されていません。 OptionDataのSkipMorphTargetがtrueの時と同様の挙動に見えます。
該当箇所は VRM4ULoader/Private/VRMConverterMorphTarget.cpp VRMConverter::ConvertMorphTarget() と思われ、たどっていくと終盤の
の部分、5.4以降の非エディタ環境ではこれに相当する処理が行われていませんでした。 試しにWITH_EDITORの中身を常に有効にしたところ、コンパイル時に次のエラーになりました。
これはTArrayの中の型がTObjectPtrか生ポインタかの違いでしたので、 次のような回避策をとったところ、こちらの環境ではコンパイルも通り、MorphTargetも正常に反映されています。
以上、ご確認いただけますと幸いです。