UE4对象的创建与销毁(UObject,Actor,ActorComponent)

简介

在C++中,创建一个对象可以分为两种方法,在栈中创建或在堆中创建。

//一:在栈中分配
	int num = 3;
//二:在堆中分配,需要手动delete释放
	int* num = new int(3);
	delete num;

UE4使用的是C++,所以引擎底层还是上面两种方法。但是对于开发者来讲,则需要使用UE4提供的方法来创建相关对象,而对于一般的UObject、AActor和AActorComponent,创建方法又有一定差异。
https://docs.unrealengine.com/en-US/Programming/UnrealArchitecture/Objects/index.html

UObject

UE4中所有的类都继承于UObject,对UObject不使用new来直接创建,而使用UE4提供的工厂方法NewObject()来创建。

  • 运行时动态创建
	UMyObject* MyObject = NewObject<UMyObject>(this);

NewObject()有多种重载方法,其中一个关键的参数为Outer*,表示这个对象的外部对象,通常可传this指针进去。

  • 如果是在构造函数中创建,请使用CreateDefaultSubobject()来创建,内部将this指针当作Outer*传进去
	MyObejct = CreateDefaultSubobject<UMyObject>(TEXT("MyObject"));
  • 蓝图中动态创建一个UObject
    NewObjectInBP
  • 销毁,由于UE4完善的垃圾回收功能,所以将全部引用指针置为nullptr即可由UE4自动回收掉。如果需要强制销毁,可使用MarkPendingKill()方法。
	MyObject->MarkPendingKill();
	MyObject = nulltpr;

AActor

  • 运行时动态创建
    运行时动态创建Actor使用SpawnActor方法,有多种重载方法。SpawnActor是World的方法,需要提供一个有效的Actor,一般的UObject都有GetWorld()方法,但是一般只有AActor或UActorComponent才会返回有效的World。
	AMyActor* MyActor = GetWorld()->SpawnActor<AMyActor>();

蓝图中生成Actor的节点。
蓝图

销毁

Actor提供一个显示销毁的方法。

	MyActor->Destroy();

蓝图中销毁Actor的节点。
DestoryActorInBP

UActorComponent

  • Actor的构造函数中创建,也是最常见创建的地方
UActorComponent* MyActorComponent = CreateDefaultSubobject<UActorComponent>(TEXT("MyActorComponentName"));

对于场景组件,可以依附在其它组件上。

MySceneComponent->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform);
  • 动态创建
    因为创建ActorComponent需要在Actor中注册,所以使用NewObject()动态创建的时候,需要将外部的Actor对象作为Outer传进去,并调用RegisterComponent()方法。
   
   UActorComponent* MyActorComponent = New<UActorComponent>(MyActor);
   MyActorComponent->RegisterComponent();
  • 蓝图中创建
    对特定的组件使用AddXXXComponent节点
    CreatComponentInBP
  • 销毁组件
    同Actor一样,可以手动调用DestroyComponent()方法。
MyActorComponent->DestoryComponent();

蓝图中销毁组件的节点。
DestoryComponent

原生C++对象

对于不是继承自UObject的C++对象,则通过C++的方式创建即可。考虑到使用new容易造成内存泄漏,还是推荐使用智能指针的方式创建和管理对象,并使用UE4自己的智能指针

TSharedPtr<FMyObjectType> NewSharedPtr = MakeShared<FMyObjectType>();
  • 13
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
UE4中,根据不同的类别,有不同的方法来创建对象。 对于继承自UObject但不继承自Actor的类,我们可以使用NewObject函数来创建对象。例如,我们可以创建一个UObjectClass类的对象,代码如下: ```cpp UObjectClass* MyClass = NewObject<UObjectClass>(); ``` 这样创建对象将由UE4引擎来管理。 对于纯C++类(即非继承自UObject的类,一般以F开头),我们可以使用new关键字来创建对象,并使用TSharedPtr和TSharedRef来管理对象。例如,我们可以创建一个MyClass类的对象,代码如下: ```cpp TSharedPtr<MyClass> MyClassPtr = MakeShareable(new MyClass()); ``` 这样创建对象将由TSharedPtr来进行引用计数,并在不再需要时自动释放内存。 对于继承自UObject类的组件类,我们也可以像创建UObject子类一样使用NewObject函数来创建组件对象。但是,创建组件后,我们需要使用RegisterComponent或RegisterAllComponents函数将其注册才能使其生效。例如,我们可以创建一个UStaticMeshComponent类的组件对象,并注册到当前对象上,代码如下: ```cpp UStaticMeshComponent* MyMeshComp = NewObject<UStaticMeshComponent>(this, TEXT("MyMeshComp")); MyMeshComp->SetupAttachment(RootComponent); MyMeshComp->SetRelativeLocation(FVector(0.f, 0.f, 0.f)); UStaticMesh* StaticMesh = LoadObject<UStaticMesh>(NULL, TEXT("StaticMesh'/Game/StaticMesh.StaticMesh'")); MyMeshComp->SetStaticMesh(StaticMesh); MyMeshComp->RegisterComponent(); ``` 这样创建的组件对象将由UE4引擎来管理,并在适当的时候进行更新和渲染。 总结起来,UE4创建对象的方法根据类别的不同而不同。对于继承自UObject的类,我们可以使用NewObject函数来创建对象;对于纯C++类,我们可以使用new关键字来创建对象,并使用TSharedPtr和TSharedRef来管理对象;对于继承自UObject的组件类,我们可以使用NewObject函数来创建组件对象,并使用RegisterComponent或RegisterAllComponents函数将其注册。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值