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機制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章