UProceduralMeshComponent* ProceduralMeshComponent =
NewObject<UProceduralMeshComponent>(MyActor);
UProceduralMeshComponent* ProceduralMeshComponent =
CreateDefaultSubobject<UProceduralMeshComponent>(TEXT("ProceduralMesh"));
NewObject函数
- 创建方式:需要传入类名作为模板参数以及一个父对象。
- 上下文环境:
NewObject
函数可以在任何上下文中使用,包括Actor
的构造函数、蓝图、C++函数等,跟new
操作符是一样的。
- 实例化方式:new一个新的对象,并返回其指针。
- 内存管理:手动管理其生命周期,但指定了outer之后,它的生命周期跟随其父,就可以自动管理咯。
- 使用场景 :在非构造函数中使用。一般来说好像都是这样,非构造函数中、运行时动态创建组件。
示例代码 :创建并添加到Actor中
UProceduralMeshComponent* ProceduralMeshComponent =
NewObject<UProceduralMeshComponent>(this);
ProceduralMeshComponent->RegisterComponent();
ProceduralMeshComponent->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform);
CreateDefaultSubobject函数
- 创建方式:类名作为模板参数,以及创建出来的对象名。
- 上下文环境:通常在
Actor
的构造函数中使用,创建默认子对象。
- 实例化方式:创建一个新的子对象,并返回其指针。
- 内存管理:自动内存管理,不需要手动释放。
- 使用场景:构造函数中,在对象创建时就创建那些组件。
示例代码:在Actor构造函数中使用
MyActor::MyActor()
{
PrimaryActorTick.bCanEverTick = true;
UProceduralMeshComponent* ProceduralMeshComponent =
CreateDefaultSubobject<UProceduralMeshComponent>(TEXT("ProceduralMesh"));
ProceduralMeshComponent->RegisterComponent();
RootComponent = ProceduralMeshComponent;
}