BLOGブログ

2024.01.31UE5UE/ C++

[UE5] FInstancedStruct を使ってみる

執筆バージョン: Unreal Engine 5.3

今回は、StructUtils Plugin 内で実装されている FInstancedStruct を紹介します。

FInstancedStruct を使うと、
本来多態的な利用が想定されていない構造体 (USTRUCT) を、
インスタンス化された UObject* プロパティのように
多態的に利用できるようになります。

……と書いてもよくわからないと思うので、簡単な使用例を示して解説しようと思います。

※ StructUtils Plugin は Experimental 扱いです。
今後仕様が変更される可能性がありますのでご注意ください。

準備

StructUtils Plugins が有効になっていない場合は、Unreal Engine の Editor を開き、
Edit → Plugins → Struct Utils のチェックをオンにして再起動してください。

UE 5.3 では本 Plugin は (Experimental にも関わらず) 最初から有効になっています。
本 Plugin を利用して実装されている LocalizableMessage Plugin が
デフォルトで有効な設定になっているためだと思われます。

また、プロジェクトの .Build.cs を編集し、
PublicDependencyModuleNames に “StructUtils” を追加します。

実装

球や三角柱といった立体図形の情報を 1 つ保持し、
その名称および体積をデバッグ出力する
Actor 継承クラス “AMyActor” を作成することにします。

コードは以下のとおりです。

球を表す構造体 FSphereStruct と三角柱を表す構造体 FTriPrismStruct が
立体図形を表す構造体 FSolidStruct の派生として宣言・定義されており、
それぞれ体積を返す関数と立体図形名を返す関数を override しています。

また、AMyActor が宣言・定義されており、
立体図形の名称および体積をデバッグ出力する関数
PrintSolidVolumeCalcResult() を
BeginPlay() で呼ぶようになっています。

FInstancedStruct 型メンバ変数の宣言

AMyActor に立体図形の情報を保持させるために
FInstancedStruct のメンバ変数を宣言しています。
該当のコードは MyActor.h の以下の部分です。

UPROPERTY のメタデータ指定子によって、
Editor 上で SolidInstance の値を設定する際に選択可能な構造体を
FSolidStruct の派生構造体 (FSphereStruct と FTriPrismStruct) に限定しています。

『BaseStruct = “/Script/MyProject.SolidStruct”』が
選択可能な構造体を FSolidStruct およびその派生構造体
(FSolidStruct, FSphereStruct, FTriPrismStruct) に限定する記述で、
『ExcludeBaseStruct』が
BaseStruct で指定した構造体自体 (FSolidStruct) を
選択可能な構造体から除外する記述となります。

『”/Script/MyProject.SolidStruct”』の部分は
「MyProject モジュールの FSolidStruct 構造体を指定する」という意味です。
構造体名から接頭辞 F を除いて指定する必要があるので注意してください。

FInstancedStruct に格納した実態へのアクセス

FInstancedStruct から実態の構造体にアクセスする部分のコードは
MyActor.cpp の以下の部分です。

ここでは const 参照を取得しており、
以降はこれを利用して FSolidStruct のメンバ関数を呼び出しています。

参照ではなくポインタで取得することも可能です。
取得関数の一覧を以下に示します。

  const 非 const
参照 Get<型>() GetMutable<型>()
ポインタ GetPtr<型>() GetMutablePtr<型>()

動作確認

AMyActor を Parent とする Blueprint (BP_MyActor) を作成し、
Details Panel から SolidInstance の項目を確認してみます。

FSolidStruct の派生構造体が選択可能になっており、
選択すると下部に対応するメンバ変数が列挙され、それぞれ値を変更できるようになっています。

(“Tri Prism Struct” 選択時の表示 ↓)

(“Sphere Struct” 選択時の表示 ↓)

また、BP_MyActor を Level に配置して Play すると、
選択した構造体の種類に応じてデバッグ出力結果が変化しています。

構造体 (USTRUCT) を多態的に利用できることが確認できました。

まとめ

FInstancedStruct について、簡単な使用例を示しました。

StructUtils Plugin は Experimental 扱いではありますが、
既に多数の Engine Plugin が本 Plugin を利用して実装されているため、
今回紹介することにしました。

FInstancedStruct 以外にも汎用的な機能が用意されているので、
興味があればソースコードを覗いてみてください。