Actor 的生命週期
Actor 在其生命週期中會經歷一系列階段。了解這些階段以及在每個階段中可以或不可以執行的操作非常重要。
這些階段適用於 actor 本身以及其內部的元件。每個階段都會先應用於所有元件,然後再進入下一個階段。
建構(Construction)
類被實例化,並調用構造函數(constructor)。
使用
inject和attach函數注入服務並附加元件。不要使用類中作為參數的屬性,因為它們的值此時尚未定義。
反序列化(Deserialisation)
使用
attach函數或Attach裝飾器設置的屬性將被賦值。在編輯器中配置的參數將被設置到 actor 和元件上。
初始化(Initialisation)
onInit方法會在 actor 上調用,然後依次調用元件上的onInit方法。onInit方法可以是異步的,並且會同時執行。因此,避免依賴其他元件的onInit方法中的邏輯,因為它們完成的順序可能不可靠。可以使用類中的參數屬性,因為此時它們已被定義。
設置訂閱並開始執行遊戲邏輯。
如果某些元件無法在建構階段附加,則可以動態附加它們。使用
this.attach。不要使用
inject或attach函數。
開始遊戲(Begin Play)
當 actor 被生成到世界中時觸發。
onBeginPlay方法會在 actor 上調用,然後依次調用元件上的onBeginPlay方法。這不會在編輯器中發生。利用此階段啟動遊戲玩法功能。
更新(Update)
在每一幀渲染(rendered)之前調用
onUpdate方法,此方法通常用於邏輯處理。執行可能需要變換渲染物件或其他視覺效果的功能。
避免在此函數中創建僅供臨時使用的新物件。由於該函數執行頻率極高,記憶體分配和垃圾回收可能對性能產生顯著影響。
避免將需要與渲染迴圈頻率不同步執行的功能放在更新階段。由於不同 actors 的
onUpdate方法調用順序無法保證一致,因此同步多個 actors 的功能可能會很困難。建議依賴來自其他 actors、元件或系統發出的事件。
延遲更新(Late Update)
與
onUpdate一樣,每幀調用一次,但會在所有onUpdate方法執行完畢後調用。當您希望確保所有
onUpdate函數完成後再執行某些代碼時,此方法非常有用。例如相機操作或跟隨特定物體,尤其是在相機需要跟隨一個已在
onUpdate方法中更新過的位置移動的物體時。
結束遊戲(End Play)
當遊戲關閉或 actor 被移除時觸發。
onEndPlay方法會在 actor 上調用,然後依次調用元件上的onEndPlay方法。這不會在編輯器中發生。
移除(Removal)
Actor 從世界中移除並被釋放。
取消所有創建的訂閱。如果您使用 RxJs 創建訂閱,可以使用
.pipe(takeUntil(this.disposed))確保當 actor 被移除時自動取消訂閱。
最后更新于