オブジェクトをインスタンス化する約4つの異なる方法を見つけましたが、私の理解が明確かどうかはわかりません。
NewObject<T>()
関数は、UObjectのインスタンスで作成するときに使用されます。たとえば、任意のActorComponentsにすることができます。
USomeComponent sc = NewObject<USomeComponent> (class);
ConstructObject<T>()
UObjectを初期化するもう1つの方法...
CreateDefaultSubobject<T>()
ですが、この1つの関数を使用して、UObject
から継承したクラスのインスタンスを作成することもできます。
SpawnActor<T>()
AActor
クラスのオブジェクトをインスタンス化するために使用されます。
最初の質問です。これらの関数を1つの目的に使用できるかどうかの違いは何ですか?いつ、どのように、なぜそれらを使用する必要があるのですか?
これらの関数の違いを理解するには、Unreal EngineのオブジェクトモデルがJavaScriptとよく似たオブジェクトプロトタイプに基づいていることを覚えておく必要があります。各UClassは、クラスのデフォルトオブジェクト(CDO)と呼ばれる、関連付けられたUObjectクラスのデフォルトインスタンスに関連付けられています。これは、エンジンが初期化されるときに、クラスコンストラクターを介して最初に割り当てられ、次に構築されますonceのみ。 CDOは、クラスの他のすべてのインスタンスがコピーされるテンプレートとして機能し、コンストラクターが再度呼び出されることはありません。
つまり、クラスコンストラクターはランタイムロジックを含むことができず、CDOとそのプロパティを初期化するためにのみ使用する必要があります。クラスにアクターコンポーネントなどのサブオブジェクトが含まれている場合、これらも同じようにする必要があるため、独自のデフォルトオブジェクトを最初に作成する必要があります。次に、エンジンの初期化後にオブジェクトの実際のインスタンス化を延期する必要があります。これにより、クラスの新しいインスタンスが通常のゲームプレイコードによって作成されるように要求されるたびに、親オブジェクトとそのすべてのサブオブジェクトがそれぞれのインスタンス化されます。デフォルト。
したがって、オブジェクトを作成するさまざまなシナリオをすべて処理するには、オブジェクトを作成する複数の方法が必要です。
UObject::CreateDefaultSubobject
は、クラスコンストラクターでのみ呼び出すことができ、サブオブジェクトのクラスのCDOのインスタンスを作成し、その外部クラスを呼び出し元オブジェクトとして設定するなどの処理を行います。作成されたオブジェクトは、そのオブジェクトクラスがインスタンス化されるときに、プロパティのデフォルトオブジェクトになります。
NewObject<T>
は、通常のゲームプレイ中に、エンジンの初期化後にオブジェクトをインスタンス化するために通常使用される関数です。ほとんどのシナリオを処理するためのいくつかの便利なオーバーロードを提供します。
UWorld::SpawnActor<T>
は、指定された位置と回転、衝突設定を含むレベルでアクターをスポーンするための便利なメソッドであり、スポーン可能なアクタークラスであることを確認し、NewObject<AActor>
のラッパーにすぎません。
ConstructObject
が削除され、NewObject
が採用されました。詳細については、エンジンのソースコード、特にCoreUObjectエンジンモジュールのUObject/UObjectGlobal.cppとUObject/UObjectGlobal.hを確認することをお勧めします。内部的には、これらすべての関数は最終的に(4.24以降)StaticConstructObject_Internal
を呼び出し、実際のオブジェクトの作成を処理します。