Mutable使用時のマルチプレイにおけるメッシュ表示不良について

現在、プレイヤーキャラクターのメッシュをMutableへ移行する作業を進めています。

しかし、マルチプレイでプレイヤーを起動した際メッシュが表示されない現象が時折発生します。

初動調査としてCustomizableObjectInstanceを確認したところ、内部にはSkeletalMeshの情報が正常に格納されていました。

さらに詳しくブレークポイントを用いて処理を追った結果、この問題が発生する状況ではSkeletalMeshComponentSetSkeletalMeshが呼び出されていない場合があることが判明しました。

この問題に関連して、さらに以下の詳細な状況も確認済みです。

  • CustomizableObjectInstanceの更新処理自体はEUpdateResult::Successで完了しています。
  • UpdatedDelegate(またはUpdatedNativeDelegate)が呼び出されていません。
  • プロジェクト側で明示的にUpdateSkeletalMeshAsyncを呼び出す処理は実装していません。
  • 常に同じActorが発生するわけではないです、またLocal,ReplicateServer,Clientも関係ないです。
  • PIE (Play In Editor) 環境NetMode: Listen Server (1体以上が現象発生する確率)
    • プレイヤー数2人の場合: 約1割の確率で発生
    • プレイヤー数3人の場合: 約9割の確率で発生
    • Run Under One Process: falseの場合でもtrueの場合と同様の発生頻度です。

これらの状況を踏まえ、以下の点についてご教示いただけますでしょうか。

  • SetSkeletalMeshが呼び出されないこの現象を解決するために、何か特定のMutable関連の設定や見落としている手順があるのでしょうか?
  • メッシュの更新処理をより確実にするために、現状のローカル処理に依存するのではなくサーバー駆動のアプローチで使用の想定しているのでしょうか?

何か解決の糸口となる情報や、他に確認すべき点などありましたらアドバイスをいただけますと幸いです。

よろしくお願いいたします。

明示的な更新は行っていないということで初期状態のメッシュがスケルタルメッシュにセットされないという問題でよろしいでしょうか。

CostomizableObjectは基本的には各プロセス上のローカルで動作するはずです。状況を共有するためにCustomizableSkeletalComponentに対してどのような初期設定やランタイムでの設定を与えているかを共有していただきたいです。もし再現プロジェクトが共有可能であれば是非ご共有いただけますと詳しい調査が可能になりますのでご検討ください。

この問題を踏まえてご調査いただいた内容の中で​

>UpdatedDelegate(またはUpdatedNativeDelegate)が呼び出されていません。

​という部分がありますが、こちらはUCustomizableSkeletalComponent::UpdatedDelegateでしょうかそれともUCustomizableObjectInstanceUsage::UpdatedDelegateでしょうか?

恐らく独自になにか関数を登録されていて、正常に動作するか否かの分岐点になっているとご判断されているのだと思うのですがこの処理内容や意図についてご共有いただけますと助かります。

手元で動作を確認したところメッシュの設定処理としては最初は以下のコールスタックで示されるように​ UCustomizableObjectInstanceUsagePrivate::Tick で処理されていました。

UnrealEditor-Engine.dll!USkeletalMeshComponent::SetSkeletalMesh(USkeletalMesh * InSkelMesh, bool bReinitPose) Line 3193 C++ UnrealEditor-CustomizableObject.dll!UCustomizableObjectInstanceUsagePrivate::SetSkeletalMeshAndOverrideMaterials(USkeletalMeshComponent & Parent, USkeletalMesh * SkeletalMesh, const UCustomizableObjectInstance & CustomizableObjectInstance, bool * bOutSkeletalMeshUpdated, bool * bOutMaterialsUpdated) Line 346 C++ UnrealEditor-CustomizableObject.dll!UCustomizableObjectInstanceUsagePrivate::Tick(float DeltaTime) Line 654 C++ UnrealEditor-Engine.dll!FTickableGameObject::TickObjects(UWorld * World, ELevelTick LevelTickType, bool bIsPaused, float DeltaSeconds) Line 196 C++ UnrealEditor-UnrealEd.dll!UEditorEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 2193 C++ UnrealEditor-UnrealEd.dll!UUnrealEdEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 550 C++ UnrealEditor.exe!FEngineLoop::Tick() Line 5877 C++ [Inline Frame] UnrealEditor.exe!EngineTick() Line 69 C++​UpdateSkeletalMeshを明示的に呼び出した場合には以下のコールスタックでも更新が行われますが、手動での更新は行われないということですのでこちらは除外できそうです。

UnrealEditor-CustomizableObject.dll!UpdateSkeletalMesh(const TSharedRef<FUpdateContextPrivate,1> & Context) Line 952 C++ UnrealEditor-CustomizableObject.dll!impl::Task_Game_Callbacks(const TSharedRef<FUpdateContextPrivate,1> & OperationData) Line 2902 C++ [Inline Frame] UnrealEditor-CustomizableObject.dll!TDelegate<void __cdecl(void),FDefaultDelegateUserPolicy>::Execute() Line 613 C++ UnrealEditor-CustomizableObject.dll!UCustomizableObjectSystem::AdvanceCurrentOperation() Line 3556 C++ UnrealEditor-CustomizableObject.dll!UCustomizableObjectSystem::TickInternal(bool bBlocking) Line 3827 C++ UnrealEditor-Engine.dll!FStreamingManagerCollection::UpdateResourceStreaming(float DeltaTime, bool bProcessEverything) Line 894 C++ UnrealEditor-Engine.dll!IStreamingManager::Tick(float DeltaTime, bool bProcessEverything) Line 737 C++ UnrealEditor-Engine.dll!FStreamingManagerCollection::Tick(float DeltaTime, bool bProcessEverything) Line 866 C++ UnrealEditor-UnrealEd.dll!UEditorEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 2414 C++ UnrealEditor-UnrealEd.dll!UUnrealEdEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 550 C++ UnrealEditor.exe!FEngineLoop::Tick() Line 5877 C++​正常系でのメッシュ設定処理がどのように行われているかご確認されていると思うのですが、UCustomizableObjectInstanceUsagePrivate::Tick内で処理されているということで間違いないでしょうか?

Skip Set Reference Skeletal Mesh 設定は設定されていますか? これがfalseの場合、UCustomizableInstanceLODManagement::UpdateInstanceDistsAndLODs で UpdateSkeletalMeshAsync が呼び出されますが、trueの場合は前コメントにあるようにUCustomizableObjectInstanceUsagePrivate::TickでSkeletalMeshがセットされており、UpdateSkeletalMeshAsyncは呼び出されていませんでした。

> 状況を共有するためにCustomizableSkeletalComponentに対してどのような初期設定やランタイムでの設定を与えているかを共有していただきたいです。

  • Customizable Object Instance => Player で使用するCOI
  • Component Index => -1 (Component Name 登録時に自動で入り以後手を加えてないです)
  • Component Name => Body

> こちらはUCustomizableSkeletalComponent::UpdatedDelegateでしょうかそれともUCustomizableObjectInstanceUsage::UpdatedDelegateでしょうか?

情報が不明瞭で大変失礼いたしました。

UCustomizableSkeletalComponent::UpdatedDelegateになります。

PIEを起動時に以下の二パターンでコールスタックが呼ばれます。

なおプロジェクト側で更新するような処理は呼んでいない状態になります。

[Image Removed]