UE5/UE4 C++でコンストラクタ(Constructor)内でクラス(Class)を生成する(FObjectInitializer::CreateDefaultSubobject)
基礎の基礎ではあるのですが、忘れないようにメモということで…。
こちらを参考にさせていただきました。
・Unreal Engine C++ 逆引きメモ
https://edom18.hateblo.jp/entry/2018/03/16/105506
どうやら、コンストラクタ内では上記のNewObjectは使えないようです。(使うとクラッシュする)
ではどうするかというと、FObjectInitializer::CreateDefaultSubobjectを利用します。
FObjectInitializerは、コンストラクタ引数に指定しておくと、UEシステムが適切に渡してくれるようになっています。
というわけで、C++でコンストラクタ内でクラスを生成する場合は「CreateDefaultSubobject」関数を使って以下のように記述します。
// コンストラクタ
UTestClass::UTestClass()
{// クラス生成
TObjectPtr< UNewClass > aInstance = CreateDefaultSubobject< UNewClass >(TEXT("Name"));}
参考サイトさんでも書かれていますが、上記は簡略化された記述となっていて(問題はないですが)
本来は以下のようなコンストラクタとクラス生成の記述になります。
// コンストラクタ
UTestClass::UTestClass(const class FObjectInitializer& ObjectInitializer): Super(ObjectInitializer){// クラス生成
TObjectPtr< UNewClass > aInstance = ObjectInitializer.CreateDefaultSubobject< UNewClass >(TEXT("Name"));}
上記記述の差ですが
とあります。なおこのコンストラクタに引数を指定した場合としない場合の挙動の差ですが、UEシステムが自動的に生成する****.generated.h内にてマクロが生成され、コンストラクタの定義に応じて書き換わるよういなっているようです。
こちらについても下記のサイトさんが参考になるようです。
・[UE4] ObjectInitializerでコンポーネント生成を制御する
http://historia.co.jp/archives/6587/
初歩的なことでもかなり知らないことは多いですね…。
| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑