【问题标题】:Unreal Engine 4. Different ways to instantiate the objectUnreal Engine 4. 实例化对象的不同方法
【发布时间】:2020-05-18 04:20:08
【问题描述】:

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

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

    USomeComponent sc = NewObject<USomeComponent> (class);

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

  • CreateDefaultSubobject<T>() 但是使用这个函数我们也可以创建一个继承自UObject 的任何类的实例。

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

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

【问题讨论】:

    标签: c++ unreal-engine4


    【解决方案1】:

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

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

    因此,需要多种创建对象的方式来处理所有不同的 可以创建对象的场景。

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

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

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

    • ConstructObject 已被删除,取而代之的是 NewObject

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

    【讨论】:

    • 那么,在一般情况下使用CreateDefaultSubobject<T>()NewObject<T>() 只是一种哲学?在构造函数内部和外部使用什么规则?
    • 使用NewObject 复制CreateDefaultSubobject 非常复杂,因为它为您做了很多事情。检查前者的来源,你会明白为什么它如此方便。但是,是的,经验法则是,CreateDefaultSubobject 在类构造函数中,NewObject 否则。
    • 顺便说一句,我错误地指出构造函数注册了组件,但实际上这些是在实例化actor时注册的,而不是在创建类时注册的。我会编辑它。
    • 知道了。我将进行来源审查。谢谢。
    • 顺便说一句,也许你有一些资源以外的资源,我可以深入了解 CDO。
    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2014-11-29
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    相关资源
    最近更新 更多