今天有使用者在使用我的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,因為是沒用的,馬上就會被回收掉!
Ahsan Muzaheed
putting a delay will work. or a loop with (getlevelName()==”desired level”) should work. i did that.
dorgon
oh, yes, it is another solution, but it think it is better to spawn actor in the BeginPlay of PlayerController or GameMode.