[UE4]UWorld與UGameInstance初始化

posted in: UnrealEngine, 開發日誌 | 2

今天有使用者在使用我的HorizonTween這套Plugin時發生了所綁定的回呼事件無法觸發的問題。深入去了解之後,發現了一個有趣的現象。

首先,他在UMyGameInstance::Init中做了類似於下面的回呼事件的綁定:

在遊戲開始後,期待著每次呼叫建立TweenEvent之後,就會回呼到這個事件中可以做一些遊戲邏輯的處理。

看起來這個劇本非常的完美,在Editor中測試也完美的運行,但是當我們實際上打包出來後就會發現:為什麼這邊的回呼綁定沒有被執行!?

首先,這邊的UHorizonTweenSystemLibrary::GetDefaultTweenSystem(this),其所產生的TweenSystem Actor,其實是跟著UWorld的生命週期走的,也就是說,當UWorld物件被引擎回收(Garbage Collection)時,這邊的TweenSystem Actor也會跟著被回收掉。當我們實際在UMyGameInstance::Init中下斷點後,就會發現一件有趣的事:

 

我們可以看到World所連結到的Map名字是Untitled,這代表什麼意思?也就是說,在UMyGameInstance::Init這個時間點,我們都還是處在引擎所暫時產生出來的『transition map』中,這個level所產生出來的world在實際的map載入之後就會被移除掉,意即剛剛在UMyGameInstance::Init所生成的任何Actor物件都會被馬上回收。

下面這張圖則是在LevelBlueprint中呼叫,我們可以發現,這次我們所產生的Actor就會存在於「正確」的world當中了(HorizonTweenDemo)。

因此我們知道:

千萬不能在UMyGameInstance::Init中Spawn任何的Actor,因為是沒用的,馬上就會被回收掉!

2 Responses

Leave a Reply

Your email address will not be published. Required fields are marked *