# Actor 的生命週期

Actor 在其生命週期中會經歷一系列階段。了解這些階段以及在每個階段中可以或不可以執行的操作非常重要。

這些階段適用於 actor 本身以及其內部的元件。每個階段都會先應用於所有元件，然後再進入下一個階段。

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

     &#x20;
8. **移除（Removal）**
   1. Actor 從世界中移除並被釋放。
   2. 取消所有創建的訂閱。如果您使用 RxJs 創建訂閱，可以使用 `.pipe(takeUntil(this.disposed))` 確保當 actor 被移除時自動取消訂閱。
