好吧,嚴格上來說,GameLoop並不在設計模式的範圍內,不過這樣分類比較方便,我就放在這裡了(拜託別打我)
再往下看之前,可以來思考一下—是甚麼條件讓遊戲跟一般的軟體操作有所差異。
一般的軟體操作中,軟體都是「被動」的接受使用者的操作,像是開啟資料夾、關閉軟體畫面、這些動作都是使用者「主動」去觸發的。
但在遊戲裡,以最近流行的開放世界來說,玩家在用搖桿操作角色暢遊奇幻世界的同時,這個世界也像真實世界那樣有著自己的步調、天色會隨著時間步入黑夜;遇到一名旅人與角色暢談這個世界的軼聞;在探索一個神廟時被藏在暗處的怪物襲擊。這些東西並不是玩家去主動操作、而是靠背後遊戲自己去更新相關邏輯去判斷玩家所在位置去處發事件、目前時間應該要產生出怎麼樣的景色這些達成。除此之外這些事物還必須配合畫面的更新才能真正的讓玩家看見這些演出。而這玩家操作、遊戲邏輯更新、畫面更新就是整個GameLoop去執行的動作。
GameLoop.cs
using LinXuan.Common.Misc;
using UnityEngine;
namespace LinXuan.Common.Main
{
public class GameLoop : MonoBehaviour
{
private SceneController m_SceneController;
private void Awake()
{
m_SceneController = new SceneController();
}
private void Start()
{
m_SceneController.SceneState = new StartGameSceneState();
}
private void Update()
{
m_SceneController.SceneState.SceneUpdate();
}
private void FixedUpdate()
{
m_SceneController.SceneState.SceneFixedUpate();
}
}
}
老實說,這邊我目前還不能把我目前的想法全部想好,所以我這邊只能說我大概對於GameLoop的想法。
因為這次遊戲場景初始化和更新的地方不太統一,分散在各個有MonoBehaviour
的Script裡,有時會發生時序問題導致運作時有點問題。我會希望之後初始化與更新的動作可以集中在SceneController
中管理,而真正讓Unity執行這些動作的地方為GameLoop中的這幾段程式。