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>();
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值