虚幻引擎 4. 实例化对象的不同方式

rav*_*iga 13 c++ unreal-engine4

我发现了大约四种不同的方法来实例化对象,但不确定我的理解是否清楚。

  • NewObject<T>()当我们想在 UObject 的实例上制作时使用的函数。例如,它可以是任何 ActorComponent。

    USomeComponent sc = NewObject<USomeComponent> (class);

  • ConstructObject<T>() 初始化 UObject 的另一种方法...

  • CreateDefaultSubobject<T>()但是使用这个函数,我们还可以创建从UObject.

  • SpawnActor<T>()用于实例化AActor类的对象。

那么第一个问题:如果我们可以将这些函数用于一个目的,有什么区别?我们如何以及何时以及为什么需要使用它们中的任何一个?

Rei*_*Rei 20

要了解这些函数之间的区别,您需要记住虚幻引擎中的对象模型基于对象原型,非常类似于 JavaScript。每个 UClass 都与关联 UObject 类的一个默认实例相关联,称为类默认对象 (CDO),它首先分配,然后在初始化引擎时通过类构造函数构造一次。CDO 充当模板,从中复制该类的所有其他实例,并且永远不会再次调用构造函数。

这意味着类构造函数不能包含任何运行时逻辑,只能用于初始化 CDO 及其属性。如果该类包含任何子对象,例如actor 组件,它们必须执行相同的操作,因此必须首先构造它们自己的默认对象。在引擎初始化之后,必须推迟对象的实际实例化,以便每次通过正常游戏代码请求创建类的新实例时,父对象及其所有子对象都从它们各自的实例化默认值。

因此,创建对象的多种方式对于处理可能创建对象的所有不同场景是必要的。

  • UObject::CreateDefaultSubobject只能在类构造函数中调用,并负责创建子对象类的 CDO 的实例,将其外部类设置为调用者对象等。当其对象类被实例化时,创建的对象将成为该属性的默认对象。

  • NewObject<T>是在正常游戏过程中通常用于在引擎初始化后实例化对象的函数。它提供了几个方便的重载来处理大多数场景。

  • UWorld::SpawnActor<T>是一种在具有指定位置和旋转的关卡中生成actor的便捷方法,生成碰撞设置,并检查以确保它是一个可生成的actor类,只不过是 NewObject<AActor>.

  • ConstructObject已被删除以支持NewObject.

我建议查看引擎源代码以获取更多信息,尤其是 CoreUObject 引擎模块中的 UObject/UObjectGlobal.cpp 和 UObject/UObjectGlobal.h。在内部,所有这些函数最终都会调用(从 4.24 开始) StaticConstructObject_Internal,它处理实际的对象创建。