UE_C++ —— UObject Instance Creation

目录

一,UObject Instance Creation

NewObject

NewNamedObject

ConstructObject

Object Flags

二,Unreal Object Handling

Automatic Property Initialization

Automatic Updating of References

Serialization

Updating of Property Values

Editor Integration

Run-Time Type Information and Casting

Garbage Collection

Network Replication


一,UObject Instance Creation

        创建对象新实例的方法;

NewObject

        NewObject() 是最简单的UObject工厂方法;它接受一个可选的外部对象和类,并用自动生成的名称创建一个新实例;

template< class T >
T* NewObject
(
    UObject* Outer = (UObject*)GetTransientPackage(),
    UClass* Class = T::StaticClass()
)
  • Outer,可选,一个待创建对象的外部 UObject
  • Class,可选,一个待创建对象类的 UClass
  • 返回值,指向生成实例(指定类)指针;
NewNamedObject

        NewNamedObject() 是在 NewObject() 上扩展,通过为新实例指定一个名称、对象标记、一个要指定为参数的模板对象;

template< class TClass >
TClass* NewNamedObject
(
    UObject* Outer,
    FName Name,
    EObjectFlags Flags = RF_NoFlags,
    UObject const* Template = NULL
)
  • Outer,一个待创建对象的外部 UObject
  • Name,一个为新对象的 名称 的 FName
  • Flags,可选,描述新对象的 FObjectFlags 枚举值;
  • Template,可选,创建新对象时用作模板的 UObject
  • 返回值,指向生成实例(指定类)指针;
ConstructObject

        为获得完全的灵活性,可以使用 ConstructObject() 函数来创建 UObjects 的新实例;此函数调用 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
)
  • Class,一个待创建对象类的 UClass
  • Outer,可选,一个待创建对象的外部 UObject
  • Name,可选,一个为新对象的 名称 的 FName
  • SetFlags,可选,描述新对象的 FObjectFlags 枚举值;
  • Template,可选,创建新对象时用作模板的 UObject
  • bCopyTransientsFromClassDefaults,可选,
  • FObjectInstancingGraph,可选,一个 布尔值 ,决定是否从类默认对象(而不是传入的原型指针)复制瞬态属性;如果 true ,使用类默认对象的瞬态;
  • 返回值,指向生成实例(指定类)指针;
Object Flags

        EObjectFlags 枚举用于快速而简洁地描述对象;有各种的标志来描述对象的类型、垃圾收集如何处理它、对象在其生命周期中所处的阶段等等;还有特殊的全掩码或无掩码和预定义的标记组;

Object Type
Flag Value Description
RF_Public 0x00000001 对象在包含它的包外部是可见的;
RF_Standalone 0x00000002 即使没有被任何东西引用,对象也会被保留以供编辑;
RF_Native 0x00000004 对象是本地对象,仅用于 UClass 对象;
Unreal Engine(UE)中,使用C++动态创建UObject是一个常见的需求。UObjectUE中所有对象的基类,提供了许多功能,如垃圾回收、反射、序列化等。以下是动态创建UObject的步骤和示例代码: ### 步骤: 1. **定义UObject子类**:首先,需要定义一个继承自UObject的类,并使用宏进行标记。 2. **实现构造函数**:确保构造函数是公有的,并且调用构造函数初始化列表。 3. **使用NewObject创建对象**:在代码中使用`NewObject`或`ConstructObject`函数来动态创建对象。 ### 示例代码: ```cpp // MyObject.h #pragma once #include "CoreMinimal.h" #include "UObject/NoExportTypes.h" #include "MyObject.generated.h" UCLASS() class MYPROJECT_API UMyObject : public UObject { GENERATED_BODY() public: UMyObject(); UFUNCTION(BlueprintCallable, Category = "MyObject") void MyFunction(); }; // MyObject.cpp #include "MyObject.h" UMyObject::UMyObject() { // 构造函数实现 } void UMyObject::MyFunction() { UE_LOG(LogTemp, Warning, TEXT("MyFunction called!")); } // 在其他类中使用动态创建UObject #include "MyOtherClass.h" #include "MyObject.h" void UMyOtherClass::CreateMyObject() { UMyObject* MyObject = NewObject<UMyObject>(GetTransientPackage(), UMyObject::StaticClass()); MyObject->MyFunction(); } ``` ### 说明: 1. **定义UObject子类**:在`MyObject.h`中定义了一个继承自`UObject`的类`UMyObject`,并使用`UCLASS()`宏进行标记。 2. **实现构造函数和函数**:在`MyObject.cpp`中实现了构造函数和`MyFunction`函数。 3. **动态创建对象**:在`MyOtherClass`中,使用`NewObject`函数在`GetTransientPackage()`中创建`UMyObject`的实例,并调用其函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值