1. 程式人生 > >Game Framework學習筆記(2):初識流程(Procedure)

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中的AwakeOnEnter類似於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機制。