[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,因為是沒用的,馬上就會被回收掉!

dorgon

dorgon

職業:LV3遊戲軟體工程師 為了追尋小時候玩遊戲的感動,而一頭栽入遊戲業界。 本來以撰寫遊戲劇本為主要志向,但回過神來才發現已經踏入程序猿的不歸路。 專長為client端跨平台遊戲開發架構與自動建置流程,主要使用引擎為cocos2d-x與UnrealEngine4。

More Posts - Website

Follow Me:
FacebookLinkedIn

2 Responses

  1. Ahsan Muzaheed
    | 回覆

    putting a delay will work. or a loop with (getlevelName()==”desired level”) should work. i did that.

    • dorgon
      dorgon
      | 回覆

      oh, yes, it is another solution, but it think it is better to spawn actor in the BeginPlay of PlayerController or GameMode.

有什麼想法嗎?請發表你的看法