close

遊戲只有一個場景在執行,所以可以讓每個場景有一個「場景類別」來負責維護<狀態擁有者>

範例場景規劃

  1. StateScene (開始場景): GameLoop(遊戲物件)的所在,我們要以一個繼承MonoBehavior的類別去執行所有場景類別
    遊戲啟動和相關遊戲設定的載入
  2. MainMenuScene(主畫面場景): 顯示遊戲名稱及開始按鈕
  3. 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(){ 呼叫狀態控制者的更新方法 }

※當要加入新場景時,只需要做下列步驟

  1. 新增場景
  2. 加入一個新的場景狀態類別對應到新場景,並在當中實作功能
  3. 決定要從哪個現有場景轉換到新的場景
  4. 決定新的場景結束後要轉換到哪一個場景
arrow
arrow
    全站熱搜

    Kouhei 發表在 痞客邦 留言(0) 人氣()