【UE4】UE4中對象的創建和銷毀


【UE4】UE4中對象的創建和銷毀

參考文章&&原文鏈接

虛幻官方文檔 - UObject實例創建

虛幻官方文檔 - 生成Actor

虛幻官方文檔 - 為Actor添加組件

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總結性知識


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM