首先說明一下 關于UE4中一些物件的名字前綴吧,雖然這個不是這一關于Actor的內容,但是后續都要用到,所以就先說明白,
關于Class類前綴:
派生自 Actor 的類前綴為 A,比如 AController,
派生自 Object 的類前綴為 U,比如 UComponent,
派生自 SWidget(Slate UI)的類前綴為 S,比如 SButton
Enums 的前綴為 E,比如 EFortificationType,
Interface 類的前綴通常為 I,比如 IAbilitySystemInterface,
Template 類的前綴為 T,比如 TArray,
其余類的前綴均為 字母 F ,比如 FVector,
--
好了,現在我們來看看Actor吧
所有可以放入UE4里關卡Level的東西都是Actor,因為Actor類的前綴是A,所以AActor作為Actor的基類也是要加有A的前綴的,這里很好理解,
值得注意的是放入關卡中的都是Actor,但是不是所有的Actor都在關卡中,例如AWorldSetting,AGameMode,AInfo等,
Actor的主要作用是作為Component的容器,也就是說我們可以給Actor添加不同的組件,從而組裝成擁有不同功能的Actor,
Actor的組件分別有三種型別
它們分別是:
1.UActorComponent:這個是基礎組件,它們通常用于概念上的功能,例如AI或者解譯玩家的輸入,
2.USenceComponent:這是擁有變換的ActorComponent(不知道什么是變換可以參考我的第一篇博客UE4 C++學習 淺析基本資料型別 - CatSevenMillion - 博客園 (cnblogs.com),里面有提到),Actor的所有變換都是取自位于層級根部的SceneComponent,
3.UPrimitiveComponent:這其實是擁有影像表達(網格體或粒子系統)的SceneComponent,碰撞以及物理設定都在這個部分,

Ticking
Tick代表著Actor在UE4中的更新方式,所有的Actor均能按每幀(Tick)來執行必要的計算,
所有Actor可以使用Tick()這個函式來默認被tick
ActorComponents 是默認被更新的,這是使用它的TickComponent()函式進行操作的,
Actor的生命周期
Actor的從創建到銷毀有多條路徑,下面依次介紹
首先是創建的程序
1.從磁盤加載(Load from Disk)
已位于關卡中的Actor使用此路徑,例如LoadMap發生時,或者AddToWorld(子關卡被呼叫),
- 關卡中的Actor從磁盤中加載
- PostLoad(終止加載)(在序列化Actor從磁盤加載完成后被呼叫,任何的自定義版本以及修復行為都應該在此發生)
- InitializeActorForPlay(為將要運行的Actor初始化)
- 為未初始化Actor執行RouteActorInitialize(分三步,ps:官方檔案中說此步還包含無縫行程攜帶,是什么暫時沒查到,應該不怎么重要,后面遇到了再回來填坑)
- PreInitializeComponents(預初始化組件) (在InitializeComponent被Actor的組件呼叫之前呼叫它)
- InitializeComponent works(初始化組件作業) (作為Helper函式用來協助創建那些被定義在Actor中的組件)
- PostInitializeComponents(終止初始化組件) (在Actor的組件被初始化之后呼叫)
- BeginPlay(關卡開始后呼叫)
2.從編輯器中開始(Play in Editor)
與第一條路徑十分相似,但此處的Actor不是從磁盤中加載,而是從編輯器中復制而來
- 編輯器中的Actor被復制到新場景中
- PostDuplicate(終止復制)
- InitializeActorForPlay
- 為未初始化Actor執行RouteActorInitialize(包含無縫行程攜帶)
- BeginPlay(關卡開始后呼叫)
3.生成(Spawning)
當生成或實體化一個Actor時,將會走這條路徑,
- SpawnActor(生成Actor)
- PostSpawnInitialize(終止生成初始化)
- PostActorCreated(終止Actor被創建)(在創建后被生成的Actor呼叫,建構式類的行為在此時發生,并且它與PostLoad互斥)
- ExecuteConstruction(執行構造)(藍圖Actor的組件在此處創建,藍圖變數在此處初始化)
- PostActorConstruction(終止Actor構造)(與之前RouteActorInitialize類似)
- OnActorSpawned (在UWorld上廣播,通常被看成是生成Actor成功的標志)
- BeginPlay (關卡后呼叫)
4.延遲生成(Deffered Spawn)
將任意屬性設為"Expose on Spawn"即可延遲 Actor 的生成,
- SpawnActorDeferred (生成程式化Actor,在藍圖構建腳本之前進行額外設定)
- 之后執行生成中的所有操作,但是在PostActorCreated之后會有以下操作:
a.通過一個有效的但是不完整的Actor實體呼叫多個“初始化函式”
b.FinishSpawningActor 呼叫后對Actor進行最侄訓
除了創建Actor之外,我們肯定為了節省資源,想要當Actor進行銷毀,主要有三個事件用于負責處理Actor的生命周期的結束,
這其實有點像我們在電腦里面洗掉檔案的操作,我們洗掉檔案先要把檔案放進回收站,然后再進行洗掉,而在這里我們我們可以先將Actor標記為銷毀,一段時間之后再將標記會銷毀的Actor通過垃圾回收的功能從記憶體中洗掉,釋放資源,
首先是銷毀程序:
1.Destory
Destroy會在Actor被移除時手動的呼叫,但是此時游戲仍然在進行中,此時的Actor處于被掛起殺死的狀態,并且將從關卡的Actors陣列中移除掉,
2.OnDestory
這是對 Destroy 的舊有反應,也許應該將這里的所有內容移到 EndPlay,因為它被關卡過渡和其他游戲清理函式呼叫
3.EndPlay
EndPlay在許多地方被呼叫來確保Actor的生命周期走向結束
在以下幾種情況下會呼叫此事件:
1.顯式呼叫Destory
2.編輯器結束Play
3.關卡轉換
4.包含Actor的流關卡被卸載
5.Actor的生命時間結束
6.程式結束(所有的Actors都要被銷毀)
其次是垃圾回收程序:
-
BeginDestroy - 物件可利用此機會釋放記憶體并處理其他多執行緒資源(即為影像執行緒代理物件),與銷毀相關的大多數游戲性功能理應在
EndPlay中更早地被處理, -
IsReadyForFinishDestroy - 垃圾回收程序將呼叫此函式,以確定物件是否可被永久解除分配,回傳
false,此函式即可延遲物件的實際銷毀,直到下一個垃圾回收程序, -
FinishDestroy -最后物件將被銷毀,這是釋放內部資料結構的另一個機會,這是記憶體釋放前的最后一次呼叫,
參考網站:
UE4型別命名前綴規則 - 知乎 (zhihu.com)
UE4隨筆:Actors - 知乎 (zhihu.com)
Actors | 虛幻引擎檔案 (unrealengine.com)
Unreal Engine 4 - Game Flow and Actor Lifecycle Overview - bright developers
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/505500.html
標籤:其他
