close
遊戲只有一個場景在執行,所以可以讓每個場景有一個「場景類別」來負責維護<狀態擁有者>
範例場景規劃
- StateScene (開始場景): GameLoop(遊戲物件)的所在,我們要以一個繼承MonoBehavior的類別去執行所有場景類別
遊戲啟動和相關遊戲設定的載入 - MainMenuScene(主畫面場景): 顯示遊戲名稱及開始按鈕
- BattleScene(戰鬥場景) :遊戲主要執行的場景
場景類別大致架構:
- 場景初始化
- 場景結束後,負責清除資源
- 定時更新遊戲邏輯單元
- 轉換到其他場景
- 其他與場景有關的遊戲實作
ISceneState 場景狀態介面(父)
- 私有狀態名稱存下,用set,get做存取
- 控制者變數,存取控制者
- 建構子→取得控制者
- 開始,結束,更新的虛擬方法
StartState (完成初始任務)
- 建構子:base,並給予狀態名稱
- override開始:可將遊戲啟動時所需要的資源載入(遊戲數值...)
- override更新:馬上將遊戲場景轉為MainMenuState
MainMenuState
- 建構子:base,並給予狀態名稱
- override開始:將按鈕初始
- 開始遊戲的方法→轉換場景BattleState(給予按鈕做監聽)
- 其他按鈕執行方法
BattleState
- 建構子:base,並給予狀態名稱
- override開始:呼叫GM單例初始
- override結束:呼叫GM單例釋放
- override更新:呼叫GM單利更新
調用GM的判斷遊戲是否結束的方法→來轉換場景MainMenuState
SceneStateController (場景狀態控制者)
- 目前的場景狀態變數
- 場景狀態是否初始過的變數
- 設定狀態方法(場景狀態,場景名稱)
1.執行是否初始改為false......................(第二點 : 場景狀態是否初始過的變數)
2.調用載入場景方法...............................(第四點 :載入場景方法(場景名稱) )
3.如果目前狀態不是null,呼叫此狀態的結束方法
4.把新的狀態設為目前狀態 - 更新方法(){
是否還已經載完→不是的話,return
判斷目前場景是否為null,並且是否還沒跑開始
→是的話,執行目前狀態的開始,是否初始過的變數設為true
判斷目前場景是否為null,調用目前場景的更新
}
GameLoop(遊戲主迴圈):MonoBehaviour
- 場景狀態控制者→建構(new)
- Awake(){ GameObject.DontDestroyOnLoad(this.gameObject) }
- Start(){ 設定起始場景,呼叫場景狀態控制者的設定狀態方法 }
- Update(){ 呼叫狀態控制者的更新方法 }
※當要加入新場景時,只需要做下列步驟:
- 新增場景
- 加入一個新的場景狀態類別對應到新場景,並在當中實作功能
- 決定要從哪個現有場景轉換到新的場景
- 決定新的場景結束後要轉換到哪一個場景
全站熱搜