C++ 虚幻引擎4。实例化对象的不同方法

C++ 虚幻引擎4。实例化对象的不同方法,c++,unreal-engine4,C++,Unreal Engine4,我找到了四种不同的实例化对象的方法,但不确定我的理解是否清晰 NewObject()当我们想在UObject实例上创建时使用的函数。例如,它可以是任何ActorComponents USomeComponent sc=NewObject(类) ConstructObject()初始化UObject的另一种方法 CreateDefaultSubobject()但使用这一函数,我们还可以创建从UObject继承的任何类的实例 SpawnActor()用于实例化AActor类的对象 那么第

我找到了四种不同的实例化对象的方法,但不确定我的理解是否清晰

  • NewObject()
    当我们想在UObject实例上创建时使用的函数。例如,它可以是任何ActorComponents

    USomeComponent sc=NewObject(类)

  • ConstructObject()
    初始化UObject的另一种方法

  • CreateDefaultSubobject()
    但使用这一函数,我们还可以创建从
    UObject
    继承的任何类的实例

  • SpawnActor()
    用于实例化
    AActor
    类的对象


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

要理解这些函数之间的区别,您需要记住对象模型 在虚幻中,引擎基于对象原型,非常类似于JavaScript。每个类都是关联的 关联的UObject类的默认实例,称为类默认对象(CDO),它是 在初始化引擎时,通过类构造函数首先分配,然后构造(仅一次)。 CDO充当一个模板,从中复制类的所有其他实例,并创建构造函数 再也没有打过电话

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

因此,创建对象的多种方法对于处理所有不同的 可能创建对象的场景

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

  • NewObject
    是一个函数,通常用于在引擎初始化后,在正常游戏过程中实例化对象。信息技术 提供了几个方便的重载来处理大多数情况

  • UWorld::SpawnActor
    是一种方便的方法,可以在指定位置和旋转的级别中生成角色, 生成冲突设置,并检查以确保它是可生成的actor类,并且只不过是
    NewObject

  • ConstructObject
    已被删除,取而代之的是
    NewObject
我建议查看引擎源代码以了解更多信息,尤其是UObject/UObject Global.cpp 以及CoreUObject引擎模块中的UObject/UObject global.h。在内部,所有这些函数最终调用(从4.24开始)
staticConstructionObject\u Internal
,它处理实际的对象创建。

那么,通常使用
CreateDefaultSubobject()
NewObject()
仅仅是一种理念?在构造函数内部和外部使用哪些规则?使用
NewObject
复制
CreateDefaultSubobject
非常复杂,因为它为您做了很多事情。检查前者的来源,你就会明白为什么它如此方便。但是,是的,经验法则是,
CreateDefaultSubobject
在类构造函数中,
NewObject
否则。顺便说一下,我错误地说构造函数注册组件,但事实上这些组件是在实例化参与者时注册的,而不是在创建类时注册的。我会把它删掉的,明白了。我将做一个来源审查。谢谢。顺便说一句,也许你有一些资源,除了来源,在那里我可以深入到CDO。