Unreal Engine 4.实例化对象的不同方法

问题描述 投票:0回答:1

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

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

    USomeComponent sc = NewObject<USomeComponent> (class);

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

  • CreateDefaultSubobject<T>(),但是使用此功能,我们还可以创建从UObject继承的任何类的实例。

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

  • [CreateDefaultSubobject<T>(),但是使用此功能,我们还可以创建从UObject继承的任何类的实例。

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

c++ unreal-engine4
1个回答
0
投票

要了解这些功能之间的区别,您需要记住对象模型在虚幻引擎中,它基于对象原型,非常类似于JavaScript。每个UClass相关联到关联的UObject类的默认实例,称为类默认对象(CDO),该默认实例是在初始化引擎时,首先通过类构造函数进行分配,然后仅通过进行构造。CDO充当模板,从中复制该类的所有其他实例,并且构造函数为再也没有打过电话。这意味着类构造函数不能包含任何运行时逻辑,而应仅用于初始化CDO及其属性。如果该类包含任何子对象,例如actor组件,这些必须做同样的事情,因此必须首先构造它们自己的默认对象。的实际实例在引擎初始化之后,必须推迟该对象,以便每次该类的新实例如果要求由正常的游戏代码创建,则从其各自的默认值实例化父对象及其所有子对象。

因此,必须使用多种创建对象的方法来处理所有不同的可能创建对象的方案。

  • UObject::CreateDefaultSubobject仅可在类构造函数中调用,并负责创建CDO实例子对象的类,将其外部类设置为调用者对象,并自动注册组件,除其他事项外。实例化其对象类后,创建的对象将成为该属性的默认对象。

  • NewObject<T>是通常在正常游戏过程中在引擎初始化后实例化对象的功能。它提供了一些方便的重载来处理大多数情况。
  • UWorld::SpawnActor<T>是一种方便的方法,可以在具有指定位置和旋转的级别中生成actor,生成碰撞设置,并检查以确保它是可生成的actor类,并且仅是的包装器NewObject<AActor>
  • [ConstructObject已被删除,以NewObject开头。

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