😅

[UE5][C++] StaticMeshComponent追加ができない?

2023/05/27に公開

概要

症状は以下のような形です。
詳細ビューから見ると、
追加したStaticMeshComponentやそれに設定したStaticMeshが見える状態でした。
StaticMeshComponent(WeaponMeshComp)のコリジョン設定が見える...

ただ、Viewport上には一切メッシュが映っていませんが...という状態です。
サイズが物凄い小さいとか、変な位置にあるとかでもない。
この辺りからハマったな...という感じがひしひしとしてきました。

コード比較

まずは追加に失敗したコード・成功したコードを記載します。

▼ 失敗したコード例

	//MeshComponentを作成して、メッシュをセット
	WeaponMeshComp = NewObject<UStaticMeshComponent>();


	//アタッチ処理
	WeaponMeshComp->AttachToComponent(RootComponent, FAttachmentTransformRules::SnapToTargetIncludingScale, WeaponItem->AttachToSocketName);

	//メッシュ設定
	if(WeaponItem->WeaponMesh.IsValid())
		WeaponMeshComp->SetStaticMesh(WeaponItem->WeaponMesh.Get());

	//レンダリングされるように
	WeaponMeshComp->RegisterComponent();
	
	//プライマリアセットからのオフセット
	WeaponMeshComp->SetRelativeTransform(WeaponItem->AttachToTransform);

#if WITH_EDITORONLY_DATA
	//詳細ビューから見えるように。
	AddInstanceComponent(WeaponMeshComp);
#endif

▼ 成功したコード例

	//MeshComponentを作成して、メッシュをセット
	WeaponMeshComp = NewObject<UStaticMeshComponent>(this,"WeaponMesh");

	//アタッチ処理
	WeaponMeshComp->AttachToComponent(RootComponent, FAttachmentTransformRules::SnapToTargetIncludingScale, WeaponItem->AttachToSocketName);

	//メッシュ設定
	if(WeaponItem->WeaponMesh.IsValid())
		WeaponMeshComp->SetStaticMesh(WeaponItem->WeaponMesh.Get());

	//レンダリングされるように
	WeaponMeshComp->RegisterComponent();
	
	//プライマリアセットからのオフセット
	WeaponMeshComp->SetRelativeTransform(WeaponItem->AttachToTransform);

#if WITH_EDITORONLY_DATA
	//詳細ビューから見えるように。
	AddInstanceComponent(WeaponMeshComp);
#endif

何が原因かお分かりいただけましたでしょうか?
そうOuterの設定が非常に大事でした!

//MeshComponentを作成して、メッシュをセット
WeaponMeshComp = NewObject<UStaticMeshComponent>(this,"WeaponMesh");

この引数でthis(キャラクター)をOuterとして渡しているのですが、
これが非常に重要でこれがないと表示されません。

基本今まではBP上で追加したり、
CreateDefaultSubobject関数をコンストラクタで使って追加したりで
そんなことは意識したことがなかったので、完全に盲点でした。

まとめ

これは分からないって...(笑)
まだまだ勉強不足だなと実感する事件でした。

ちなみに、RegisterComponentで登録しておかないと、
追加したStaticMeshComponentが表示されないので、
お気を付けください。
※意外となじみがない関数ではあるかと思ったので

Discussion