最近看教學,有個講解UE4初始化順序的,記錄一下。
首先創建一個Actor,Character,GameInstance,GameMode,LevelScriptActor(關卡),PlayerController。
首先看一下actor的生命周期
Actor的頭文件對於生成順序注釋是:
我們把actor藍圖直接拖入ue關卡中的話,應該會走從磁盤加載的流程。
已位於關卡中的 Actor 使用此路徑,如 LoadMap 發生時、或 AddToWorld(從流關卡或子關卡)被調用時。
-
首先調用構造函數,包/關卡中的 Actor 從磁盤中進行加載。
-
PostLoad - 在序列化 Actor 從磁盤加載完成后被調用。
-
InitializeActorsForPlay
-
為未初始化的 Actor 執行 RouteActorInitialize(包含無縫行程攜帶)
-
PreInitializeComponents - 在 Actor 的組件上調用 InitializeComponent 之前進行調用
-
InitializeComponent - Actor 上定義的每個組件的創建輔助函數。
-
PostInitializeComponents - Actor 的組件初始化后調用
-
-
BeginPlay - 關卡開始后調用
然后在C++中,分別在構造函數,PostInitializeComponents,BeginPlay,tick函數后面打印下log(時間順序從下往上)。
上面的解釋:
GameInstance是在world生成之前就已經存在的一個object,世界存在於它下面的WorldContext,所以一般用來存儲整個游戲中的一些數據。 切換world或者level其實就是更換下它下面的數據。
所以在上面的打印之前,先調用GameInstance的init(),然后創建世界。
創建世界下面的關卡,以及關卡下所有的actor
然后讀取worldsetting下的gamemode
打印順序並不是嚴格按照順序來的。
然后開始調用beginplay
我們在HUD的beginplay下面創建了widget
所以在HUD的beginplay后調用widget的構造函數。
最后進行Tick函數。
內容部分來源於https://didi.ke.qq.com/。
學習ue4 c++可以看看這個大佬的教程,很棒。