GSIBase
Coding Style wiki
GSIBase 是 GSIFrame(Game Stage Integration)的遊戲階段抽象基類。每個遊戲階段(如啟動、商標、熱更、登入、大廳)都以一個子類繼承 GSIBase 實作,定義了 OnCreate → OnEnter → OnUpdate → OnExit 的完整階段生命週期,由 GSIManagerBase 子類統一註冊、切換與驅動。
| 命名空間 | OxGFrame.GSIFrame |
| 類型 | public abstract class |
| 原始碼 | GSIBase.cs |
using OxGFrame.GSIFrame;
宣告
public abstract class GSIBase
繼承 GSIBase 後,必須實作 OnCreate、OnEnter、OnUpdate、OnExit 四個生命週期方法(皆為 abstract)。
生命週期與呼叫時序
生命週期方法皆由管理器(GSIManagerBase 子類)在階段切換與驅動更新時自動呼叫,無需手動觸發。當管理器切換至該階段時,內部初始流程依以下順序執行:
- 首次檢查:若該階段從未初始化過,先
awaitOnCreate(整個生命週期僅執行一次)。 - Step 1:呼叫 StopUpdate,先暫停
OnUpdate刷新。 - Step 2:
awaitOnEnter,執行進入階段的初始邏輯。 - Step 3:呼叫 RunUpdate,開啟
OnUpdate刷新。
之後,管理器於每幀驅動更新(DriveUpdate)時,若該階段為當前階段且 runUpdate 為 true,將呼叫 OnUpdate;切換至其他階段時,管理器會先呼叫該階段的 OnExit,再執行新階段的初始流程。
提醒 OnCreate 與 OnEnter 皆為 UniTask 非同步方法,可直接 await 資源載入等非同步操作;初始流程會等 OnEnter 完成後才開啟 OnUpdate 刷新。
注意 初始流程以 Forget()(Fire-and-Forget)方式啟動,不會阻塞管理器的驅動更新。
繼承實作範例
using Cysharp.Threading.Tasks;
using OxGFrame.GSIFrame;
using UnityEngine;
// 自訂遊戲階段:繼承 GSIBase 並覆寫四個生命週期方法
public class StartupStageExample : GSIBase
{
public async override UniTask OnCreate()
{
// 首次切換至該階段時執行一次,適合進行一次性的初始
Debug.Log($"StartupStage OnCreate, Id: {this.id}");
}
public async override UniTask OnEnter()
{
// 每次切換進入該階段時執行
// 可 await 資源預載等非同步操作,完成後才會開啟 OnUpdate 刷新
Debug.Log("StartupStage OnEnter");
}
public override void OnUpdate(float dt = 0.0f)
{
// 階段活躍期間每幀執行(由管理器的驅動更新呼叫)
}
public override void OnExit()
{
// 切換至其他階段時執行,清理該階段產生的資料
Debug.Log("StartupStage OnExit");
}
}
階段子類需透過 GSIManagerBase 子類進行註冊與切換:
// 於任意處透過管理器切換至該階段(詳見 GSIManagerBase)
GSIManagerExample.ChangeStage<StartupStageExample>();
提醒 可透過 Project 視窗右鍵範本快速建立階段子類:Create → OxGFrame → GSI Frame → Template Scripts → Template GSI.cs (Game Stage)。
成員總覽
屬性
| 屬性 | 說明 |
|---|---|
| id | 階段辨識碼(註冊時由管理器自動設定)。 |
| runUpdate | 是否運行 OnUpdate 刷新的開關。 |