UnrealEngineのRuntimeでStaticMeshのScreenSizeを動的に変更することができたので調査した内容をメモしておきます。
環境
UE5.3.2
RuntimeでScreenSizeを変えたい理由
DatasmithRuntimeを利用してRuntimeで3Dデータの表示を行っているのですが、Twinmotionのモデルを読み込むと木や人のモデルのLODがすぐに切り替わってしまって荒いモデルが見えてしまうので、動的にScreenSizeを変更する方法を調査していました。
以下の木のモデルだとLOD3のScreenSizeが0.421875という大きい値になっておりすぐにこのモデルが見えてしまいます。
ScreenSizeを変える方法
以下のサンプルコードのような形で変更できるみたいです。
void UMyUtils::SetLOD(UStaticMesh* Mesh)
{
int32 NumLODs = Mesh->GetNumLODs();
if (NumLODs >= 4)
{
#if WITH_EDITORONLY_DATA
// StaicMeshEidotr用の変更
Mesh->bAutoComputeLODScreenSize = false;
#endif
#if WITH_EDITOR
// StaticMeshEditor用の変更
Mesh->GetSourceModel(0).ScreenSize = 0.5;
Mesh->GetSourceModel(1).ScreenSize = 0.1;
Mesh->GetRenderData()->ScreenSize[2] = 0.05;
Mesh->GetSourceModel(3).ScreenSize = 0.002;
#endif
Mesh->GetRenderData()->ScreenSize[0] = 0.5;
Mesh->GetRenderData()->ScreenSize[1] = 0.1;
Mesh->GetRenderData()->ScreenSize[2] = 0.05;
Mesh->GetRenderData()->ScreenSize[3] = 0.002;
// 変更したStaticMeshに対してStaticMeshComponentへの描画の反映
{
FStaticMeshComponentRecreateRenderStateContext ReregisterContext(Mesh, false);
Mesh->Modify();
}
}
StaticMeshEditorの変更だけだとUI上の値しか変更されないようで実際の動作には影響を及ぼさないみたいです。
StaticMeshのRenderDataに対してScreenSizeを変更して、StaticMeshComponentに描画の反映をする必要があるみたいです。
参照したコード
StaticMeshEditorのScreenSizeを変更した際の処理を参照しました。