UE5C++中,NewObject<>()和CreateDefaultSubobject<>()的区别

发布于:2024-07-25 ⋅ 阅读:(144) ⋅ 点赞:(0)
UProceduralMeshComponent* ProceduralMeshComponent = 
	NewObject<UProceduralMeshComponent>(MyActor);
UProceduralMeshComponent* ProceduralMeshComponent = 
	CreateDefaultSubobject<UProceduralMeshComponent>(TEXT("ProceduralMesh"));

NewObject函数


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

CreateDefaultSubobject函数


  1. 创建方式:类名作为模板参数,以及创建出来的对象名。
  2. 上下文环境:通常在Actor的构造函数中使用,创建默认子对象。
  3. 实例化方式:创建一个新的子对象,并返回其指针。
  4. 内存管理自动内存管理,不需要手动释放。
  5. 使用场景:构造函数中,在对象创建时就创建那些组件。
示例代码:在Actor构造函数中使用
MyActor::MyActor()
{
    PrimaryActorTick.bCanEverTick = true;
    UProceduralMeshComponent* ProceduralMeshComponent = 
    	CreateDefaultSubobject<UProceduralMeshComponent>(TEXT("ProceduralMesh"));
    ProceduralMeshComponent->RegisterComponent();
    RootComponent = ProceduralMeshComponent;
}