UObject实例创建

本页面的内容:

NewObject

NewObject()是最为简单的UObject工厂模式。它需要可选的外部对象和类,并会创建拥有自动生成的名称的新实例。

template< class T >
T* NewObject
(
    UObject* Outer=(UObject*)GetTransientPackage(),
    UClass* Class=T::StaticClass() 
)
参数 描述
外部 可选。UObject作为被创建的 对象 的外部参数。
可选。UClass定义待创建的 对象 类。

返回值

指向指定类生成实例的指针。

NewNamedObject

NewNamedObject()展开于NewObject(),通过对新实例,对象标识 以及模板对象命名,从而被作为参数定义。

template< class TClass >
TClass* NewNamedObject
(
    UObject* Outer, 
    FName Name, 
    EObjectFlags Flags = RF_NoFlags, 
    UObject const* Template=NULL
)
参数 描述
外部 UObject作为被创建的 对象 的外部参数。
名称 FName 作为新 对象名称参数。
标志 可选。FObjectFlags枚举值描述新 对象
Template 可选的。UObject在创建新 对象 时被作为模板使用。

返回值

指向指定类生成实例的指针。

ConstructObject

为达到完全的灵活性,UObjects的新实例可以通过ConstructObject()函数来进行创建。此函数调用分配 对象StaticConstructObject()函数,执行 ClassConstructor并执行任何初始化任务,例如载入配置属性,载入本地化属性以及实例化组件。

template< class T >
T* ConstructObject
(
    UClass* Class, 
    UObject* Outer = (UObject*)GetTransientPackage(), 
    FName Name=NAME_None, 
    EObjectFlags SetFlags=RF_NoFlags, 
    UObject const* Template=NULL, 
    bool bCopyTransientsFromClassDefaults=false, 
    struct FObjectInstancingGraph* InstanceGraph=NULL 
)
参数 描述
UClass定义待创建的 对象 类。
外部 可选。UObject作为被创建的 对象 的外部参数。
名称 可选。FName 作为新 对象名称参数。
设置标识 可选。EObjectFlags枚举值描述新 对象
Template 可选的。UObject在创建新 对象 时被作为模板使用。
bCopyTransientsFromClassDefaults 可选。布尔值决定是否从类默认对象而不是传入的原型指针处来复制临时属性。如此值为,将使用类默认对象的临时值。
FObjectInstancingGraph 可选。FObjectInstancingGraph结构包含对实例化对象和组件到其模板的映射。在由新 对象 所拥有的组件进行实例化时使用。

返回值

指向指定类生成实例的指针。

对象标识

EObjectFlags 枚举值用来快速并简洁地描述 对象对象 类型,垃圾回收如何处理该类型以及 对象 在其生命周期的哪个阶段等信息都有不同的标识进行描述。同时还有特殊的全局蒙版/无蒙版以及预定义的标识组。

标识 描述

对象类型

RF_Public 0x00000001 对象 在其其所包含的包外可见。
RF_Standalone 0x00000002 尽管没有被任何函数引用, 对象 也被保存用来编辑。
RF_Native 0x00000004 对象 为native类。这仅用于UClass对象。
RF_Transactional 0x00000008 对象 为交互的。
RF_ClassDefaultObject 0x00000010 对象 是其类的默认对象,例如,在被创建时该类使用的默认模板的新实例。
RF_ArchetypeObject 0x00000020 对象 为其他对象的模板。它被作为类默认对象处理。
RF_Transient 0x00000040 对象 没有被存储到硬盘上。

垃圾回收

RF_RootSet 0x00000080 即使没有被任何函数引用, 对象 也不会被垃圾回收。
RF_IsLazyReferenced 0x00000100 对象 由缓慢的指针引用并且在删除时需要额外的清理。
RF_Unreachable 0x00000200 对象 在对象图表上无法获得。
RF_TagGarbageTemp 0x00000400 对象 由使用垃圾回收的不同工具标记来使用。此标识并不由垃圾回收器本身所定义。

对象生命周期

RF_NeedLoad 0x00000800 对象 需要载入。
RF_AsyncLoading 0x00001000 对象 正被异步载入。
RF_NeedPostLoad 0x00002000 对象 需要被滞后加载。
RF_NeedPostLoadSubobjects 0x00004000 对象 仍需要实例化子对象并修复序列化的组件引用
RF_PendingKill 0x00008000 对象 正等待销毁。将 对象 在游戏中标记为无效,但仍为有效 对象
RF_BeginDestroyed 0x00010000 对象 已调用BeginDestroy()
RF_FinishDestroyed 0x00020000 对象 已调用 FinishDestroy()

特殊蒙板

RF_AllFlags 0x0003ffff 对象 拥有所有标识。主要用来检查错误。
RF_NoFlags 0x00000000 对象 没有标识。被用来防止转换。

预定义组

RF_Load

RF_Public | RF_Standalone | RF_Native | RF_Transactional | RF_ClassDefaultObject | RF_ArchetypeObject

标识被从虚幻文件中载入。
RF_PropagateToSubobjects

RF_Public | RF_ArchetypeObject | RF_Transactional

由子对象从其超级对象继承的标识。