ruyo / VRM4U

Runtime VRM loader for UnrealEngine5
Other
1.41k stars 182 forks source link

[UE5.4]パッケージ化した実行ファイルでランタイムロード時にMorphTargetが反映されない #406

Closed hyaguchi947d closed 3 months ago

hyaguchi947d commented 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

以上、ご確認いただけますと幸いです。

ruyo commented 3 months ago

ソースまで追っていただいてありがとうございます! 手元でも問題を確認、修正できました。リポジトリに反映しました。