【UE4】UE4中對象的創建和銷毀
參考文章&&原文鏈接
UObject
創建
創建運行時動態
創建UE4中所有的類都繼承於UObject,對UObject不使用new來直接創建,而使用UE4提供的工廠方法NewObject()來創建:
UMyObject* MyObject = NewObject<UMyObject>(this);
NewObject()有多種重載方法,其中一個關鍵的參數為Outer*,表示這個對象的外部對象,通常可傳this指針進去。
構造函數中創建
使用CreateDefaultSubobject()來創建,內部將this指針當作Outer*傳進去。
MyObejct = CreateDefaultSubobject<UMyObject>(TEXT("MyObject"));
銷毀
自動銷毀
UObject及其派生 具有被 UE4 垃圾回收機制管理,因而當指向對象的指針為 nullptr 后,將會被 UE4 自動回收掉:
Obj = NewObject<UItemObject>(this, TEXT("Obj"));
Obj = nullptr;
主動銷毀
方式一:UObject::ConditionalBeginDestroy()
Obj->ConditionalBeginDestroy();
Obj = nullptr;
異常步執行且對象在當前幀內持續有效,等待下次GC。
方式二:MarkPendingKill()標記為PendingKill,等待回收。指向此實例的指針將設置為NULL,並在下一次GC時刪除。
Obj->MarkPendingKill();
Obj = nullptr;
IsPendingKill 判斷是否處於 PendingKill 狀態。
ClearPendingKill 清除 PendingKill 狀態。
Engine\Config\BaseEngine.ini 更改下面參數,設置銷毀時間間隔:
gc.TimeBetweenPurgingPendingKillObjects=60
強制垃圾回收
GEngine->ForceGarbageCollection(true);
Actor
運行時動態創建
運行時動態創建Actor使用SpawnActor方法,有多種重載方法。SpawnActor是World的方法,需要提供一個有效的Actor,一般的UObject都有GetWorld()方法,但是一般只有AActor或UActorComponent才會返回有效的World。
AMyActor* MyActor = GetWorld()->SpawnActor<AMyActor>();
銷毀
MyActor->Destroy();
等待下次GC。
ActorComponent
創建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();
銷毀組件
同Actor一樣,可以手動調用DestroyComponent()方法。
MyActorComponent->DestoryComponent();
等待GC。
原生C++對象
對於不是繼承自UObject的C++對象,則通過C++的方式創建即可。考慮到使用new容易造成內存泄漏,還是推薦使用智能指針的方式創建和管理對象,並使用UE4自己的智能指針。
TSharedPtr<FMyObjectType> NewSharedPtr = MakeShared<FMyObjectType>();
本文標簽
游戲開發、游戲開發基礎、Unreal Engine、總結性知識、UE總結性知識。
