fc2ブログ

凛(kagring)のUE5/UE4とゲーム制作と雑記ブログ

2016 年から UE4 / 2021年から UE5 を触り始めました。勉強したもののメモ用ブログです。ゲーム制作に関するメモや雑記とか色々あります。C++ での Qt、Unity もほんの少しあります。

PREV | PAGE-SELECT | NEXT

≫ EDIT

UE5/UE4 C++でコンストラクタ(Constructor)内でクラス(Class)を生成する(FObjectInitializer::CreateDefaultSubobject)

C++でコンストラクタ(Constructor)内でクラス(Class)を生成する方法です。

基礎の基礎ではあるのですが、忘れないようにメモということで…。
こちらを参考にさせていただきました。

・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↑

COMMENT















非公開コメント

TRACKBACK URL

http://kagring.blog.fc2.com/tb.php/708-bd201b93

TRACKBACK

PREV | PAGE-SELECT | NEXT