GameFramework的导入
看了之前的之前的文章,我默认大家都已经调试好了,如果没有的话,我推荐GF作者的工程源码
第一个流程的创建
在工程导入之后,我们的初始目录是这样的
在GameMain文件夹中中是GF作者写的代码(我们先不要删除),我们可以先不看他们
我们在Scripts下创建一个文件夹叫做Procedure,在向其中添加一个叫做ProcedureStart.cs的文件
创建完毕之后应该是这样的:
我们打开文件进行编辑
using GameFramework;
using GameFramework.Procedure;
using UnityGameFramework.Runtime;
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;
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,切换右边的入口为ProcedureStart
运行结果:
添加更多的流程,进行流程切换
假设我们要做一个登录游戏的功能,我们需要一个登录流程,如果没有账号我们需要注册,在选择登陆和注册的时候我们需要一个菜单选择流程,登录成功之后我们进入到游戏流程
我们画一个图:
我们创建四个类:
ProcedureMenuChose //菜单选择流程
ProcedureLogin //登陆流程
ProcedureRegister //注册流程
ProcedureGameMain //游戏流程
由于我们还没有讲到UI的部分,我们没有办法进行输入,我们用特殊的方式来代替
切换到游戏流程的时候我们,需要切换场景。
我们在如图所示的地方创建场景
我们在File->build setting里面添加场景双击GameMain场景,和源场景
)
我们点击GameFramework中的procedure调整检视面板(入口也要调整)
下面我们开始编码,由于我们没有输入,我们采用计时的方式让大家感受一下流程的切换
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<ProcedureRegister>(procedureOwner);//切换到注册流程
index = !index;
}
else
{
ChangeState<ProcedureLogin>(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<ProcedureGameMain>(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<ProcedureMenuChose>(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<SceneComponent>();
Scene.LoadScene("Assets/GameMain/Scene/GameMain.unity");
}
// 每次轮询执行。
protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
}
}
}
总结:
我们通过实战,体会了流程的创建,流程的切换的基本操作。其实流程很简单,就是继承自ProcedureBase就可以了,关于其他操作请看后续教程