Game Framework學習筆記(2):初識流程(Procedure)
Game Framework學習筆記的第二篇:流程
流程是貫穿遊戲執行時整個生命週期的有限狀態機。
之前的文章:
Game Framework學習筆記(1):初識Game Framework
流程介紹
在介紹流程之前,我們得先了解什麼是有限狀態機。
有限狀態機
有限狀態機,英文縮寫FSM(Finite State Machine),其在任意時刻都處於有限狀態集合中的某一狀態。 這裡有兩個重點:首先它是離散的,其次他的狀態是有限的。
有限狀態機是一個非常重要的概念,在計算機領域發揮了巨大的作用。我們在這裡也不用過分深究,深究的話整個文章的重點也就跑偏了。簡單的舉個例子:
比如水果忍者,遊戲中水果的狀態是有限的,他就是一個有限狀態機:它每一幀的變化都是離散的狀態的變化。當你的手指切到水果,水果就會感應到被切這個事件,做出相應的響應——被摧毀。
流程(Procedure)
流程是貫穿遊戲執行時整個生命週期的有限狀態機。
對於網路遊戲,你可能需要如檢查資源流程、更新資源流程、檢查伺服器列表流程、選擇伺服器流程、登入伺服器流程、建立角色流程等流程,而對於單機遊戲,你可能需要在遊戲選擇選單流程和遊戲實際玩法流程之間做切換。
這些出自作者的第一篇文件 流程使用手冊。
流程使用
上面的我們只需要大概明白個概念,就算沒明白也不要緊,下面就是如何正式操作。
Procedure Component
首先開啟我們之前生成的空專案,並開啟之前我們打過的***Example***場景。
如圖,找出場景中GameFramework的子物件Procedure,點選:
在右邊的Inspector中,我們可以看到Procedure物件掛載的Procedure Component**指令碼。
到這裡就比較好懂了。
**Available Procedures:**元件所檢測到的流程指令碼,會全部列在這裡。只要打上對勾,我們就可以在遊戲內切換到它了。
目前只有一個流程GameFrameworkExample.ProcedureExample
**Entrance Procedure:**流程入口,也就是遊戲啟動後會進入的第一個流程。
同樣,目前只有一個流程,當然是GameFrameworkExample.ProcedureExample
。
流程指令碼
接著來看流程指令碼。
剛剛從元件裡得知,我們現在有且只有一個流程,你應該也能猜到,就是我們上一篇文章開啟過的ProcedureExample
。
這次我們依舊開啟它。
開啟後,我們來看看ProcedureExample類。
public class ProcedureExample : ProcedureBase
{
protected override void OnEnter(ProcedureOwner procedureOwner)
{
base.OnEnter(procedureOwner);
string welcomeMessage = string.Format("Hello! This is an empty project based on Game Framework {0}.", GameFrameworkEntry.Version);
Log.Info(welcomeMessage);
Log.Warning(welcomeMessage);
Log.Error(welcomeMessage);
}
}
如果想增加流程,只要派生自 ProcedureBase 類並實現自己的流程類即可使用。
同樣,ProcedureExample類也派生自ProcedureBase,因此能夠被Procedure Component識別,在元件裡面顯示。
根據框架作者的文件,我們新建一個流程ProcedureMain。
using GameFramework.Procedure;
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;
namespace Game
{
public class ProcedureMain : ProcedureBase
{
// 遊戲初始化時執行。
protected override void OnInit(ProcedureOwner procedureOwner)
{
base.OnInit(procedureOwner);
}
// 每次進入這個流程時執行。
protected override void OnEnter(ProcedureOwner procedureOwner)
{
base.OnEnter(procedureOwner);
}
// 每次輪詢執行。
protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
}
// 每次離開這個流程時執行。
protected override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown)
{
base.OnLeave(procedureOwner, isShutdown);
}
// 遊戲退出時執行。
protected override void OnDestroy(ProcedureOwner procedureOwner)
{
base.OnDestroy(procedureOwner);
}
}
}
上面的程式碼基本講清楚了流程類的用法。
根據我的理解,OnInit類似於我們普通的Unity指令碼繼承的monoBehaviour中的Awake,OnEnter類似於Start,OnUpdate類似於Update。
新建好了以後,我們就能在流程外掛處看到我們的流程了,勾上對勾就可用了:
接著我們再開啟ProcedureExample
,修改OnUpdate()方法:
protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
ChangeState<Game.ProcedureMain>(procedureOwner); // 切換流程到 ProcedureMain
}
ChangeState<Game.ProcedureMain>(procedureOwner);
能讓我們進入我們剛剛新建的Game.ProcedureMain流程。
為了能夠清楚我們到底有沒有進入ProcedureMain,我們在ProcedureMain的OnEnter()中加入一行程式碼:
protected override void OnEnter(ProcedureOwner procedureOwner)
{
base.OnEnter(procedureOwner);
Log.Debug("進入ProcedureMain!");
}
接著我們儲存程式碼,返回Unity,點選play按鈕。
不出意外的話,就會出現Log資訊。
我們成功從GameFrameworkExample.ProcedureExample
切換到了Game.ProcedureMain
。
本篇文章先到此為止,接下來下一篇文章我們會了解下Game Framework的UI機制。