GameFramework实战一(流程的创建)

GameFramework的导入

看了之前的之前的文章,我默认大家都已经调试好了,如果没有的话,我推荐GF作者的工程源码

第一个流程的创建

在工程导入之后,我们的初始目录是这样的GameFramework实战一(流程的创建)_第1张图片

在GameMain文件夹中中是GF作者写的代码(我们先不要删除),我们可以先不看他们
我们在Scripts下创建一个文件夹叫做Procedure,在向其中添加一个叫做ProcedureStart.cs的文件
创建完毕之后应该是这样的:
GameFramework实战一(流程的创建)_第2张图片
我们打开文件进行编辑

using GameFramework;
using GameFramework.Procedure;
using UnityGameFramework.Runtime;
using ProcedureOwner = GameFramework.Fsm.IFsm;

namespace Tutorial
{
    public class ProcedureStart : ProcedureBase
    {
        // 游戏初始化时执行。
        protected override void OnInit(ProcedureOwner procedureOwner)
        {
            base.OnInit(procedureOwner);
            // 打印调试级别日志,用于记录调试类日志信息
            Log.Debug("OnInit");
        }

        // 每次进入这个流程时执行。
        protected override void OnEnter(ProcedureOwner procedureOwner)
        {
            base.OnEnter(procedureOwner);
            Log.Debug("OnEnter");

        }

        // 每次轮询执行。
        protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
            Log.Debug("OnUpdate");
        }

        // 每次离开这个流程时执行。
        protected override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown)
        {
            base.OnLeave(procedureOwner, isShutdown);
            Log.Debug("OnLeave");
        }

        // 游戏退出时执行。
        protected override void OnDestroy(ProcedureOwner procedureOwner)
        {
            base.OnDestroy(procedureOwner);
            Log.Debug("OnDestroy");
        }
    }
}

找到文件夹中的TutorialLauncher场景打开
我们点击GameFramework中的procedure,切换右边的入口为ProcedureStartGameFramework实战一(流程的创建)_第3张图片

GameFramework实战一(流程的创建)_第4张图片

运行结果:
GameFramework实战一(流程的创建)_第5张图片

添加更多的流程,进行流程切换

假设我们要做一个登录游戏的功能,我们需要一个登录流程,如果没有账号我们需要注册,在选择登陆和注册的时候我们需要一个菜单选择流程,登录成功之后我们进入到游戏流程

我们画一个图:

GameFramework实战一(流程的创建)_第6张图片

我们创建四个类:
ProcedureMenuChose //菜单选择流程
ProcedureLogin //登陆流程
ProcedureRegister //注册流程
ProcedureGameMain //游戏流程

由于我们还没有讲到UI的部分,我们没有办法进行输入,我们用特殊的方式来代替

切换到游戏流程的时候我们,需要切换场景。
我们在如图所示的地方创建场景
GameFramework实战一(流程的创建)_第7张图片

我们在File->build setting里面添加场景双击GameMain场景,和源场景GameFramework实战一(流程的创建)_第8张图片

我们点击GameFramework中的procedure调整检视面板(入口也要调整)
GameFramework实战一(流程的创建)_第9张图片

下面我们开始编码,由于我们没有输入,我们采用计时的方式让大家感受一下流程的切换

ProcedureMenuChose.cs

namespace Tutorial
{
    public class ProcedureMenuChose : ProcedureBase//ProcedureLogin	
    {
        float m_time_range;//流程切换的时间间隔
        float m_time;//计时
        bool index;//菜单选择,ture表示注册,false表示登陆

        protected override void OnInit(ProcedureOwner procedureOwner)
        {
            base.OnInit(procedureOwner);
            m_time = 0f;//计时清理
            m_time_range = 1f;//间隔
            index = true;//一开始我们选择注册
        }

        // 每次进入这个流程时执行。
        protected override void OnEnter(ProcedureOwner procedureOwner)
        {
            base.OnEnter(procedureOwner);
            Log.Debug("进入菜单流程");
            m_time = 0f;//计时清理
        }

        // 每次轮询执行。
        protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
            m_time += elapseSeconds;//elapseSeconds就是Time.deltaTime
            if (m_time>1f)
            {
                if(index)
                {
                    ChangeState(procedureOwner);//切换到注册流程
                    index = !index;
                }
                else
                {
                    ChangeState(procedureOwner);//切换到登陆流程
                    index = !index;
                }
            }
        }
    }
}

ProcedureLogin.cs:

namespace Tutorial
{
    public class ProcedureLogin : ProcedureBase//ProcedureRegister	
    {
        float m_time_range;//流程切换的时间间隔
        float m_time;//计时

        protected override void OnInit(ProcedureOwner procedureOwner)
        {
            base.OnInit(procedureOwner);
            m_time = 0f;//计时清理
            m_time_range = 1f;//间隔
        }

        // 每次进入这个流程时执行。
        protected override void OnEnter(ProcedureOwner procedureOwner)
        {
            base.OnEnter(procedureOwner);
            Log.Debug("进入登陆流程");
        }

        // 每次轮询执行。
        protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
            m_time += elapseSeconds;
            if (m_time > 1f)
            {
                ChangeState(procedureOwner);//登陆成功,切换到游戏流程
            }
        }
    }
}

ProcedureRegister.cs:

namespace Tutorial
{
    public class ProcedureRegister : ProcedureBase//ProcedureGameMain	
    {
        float m_time_range;//流程切换的时间间隔
        float m_time;//计时

        protected override void OnInit(ProcedureOwner procedureOwner)
        {
            base.OnInit(procedureOwner);
            m_time = 0f;//计时清理
            m_time_range = 1f;//间隔
        }

        // 每次进入这个流程时执行。
        protected override void OnEnter(ProcedureOwner procedureOwner)
        {
            base.OnEnter(procedureOwner);
            Log.Debug("进入注册流程");
        }

        // 每次轮询执行。
        protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
            m_time += elapseSeconds;
            if(m_time>1f)
            {
                ChangeState(procedureOwner);//注册失败,切换到菜单选择流程
            }
        }
    }
}

ProcedureGameMain.cs:

namespace Tutorial
{
    public class ProcedureGameMain : ProcedureBase//ProcedureGameMain
    {
        // 每次进入这个流程时执行。
        protected override void OnEnter(ProcedureOwner procedureOwner)
        {
            base.OnEnter(procedureOwner);
            Log.Debug("进入游戏主流程,并切换主场景");
            SceneComponent Scene
            = UnityGameFramework.Runtime.GameEntry.GetComponent();
            Scene.LoadScene("Assets/GameMain/Scene/GameMain.unity");
        }

        // 每次轮询执行。
        protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
        }
    }
}

总结:

我们通过实战,体会了流程的创建,流程的切换的基本操作。其实流程很简单,就是继承自ProcedureBase就可以了,关于其他操作请看后续教程

你可能感兴趣的:(unity3d,软件框架)