Fsm模块在上一篇文章中已经完成,我们便可以开始着手Procedure模块的开发了
下面是官网对Procedure的介绍
首先新建一个Procedure文件夹,在其中新建ProcedureBase类和ProcedureManager类
其中
ProcedureBase是流程基类,属于一种状态
ProcedureManager是流程管理器,负责管理所有流程。
打开ProcedureBase,使其继承FsmState<ProcedureManager>,并重写两个生命周期方法
/// <summary>
/// 流程基类
/// </summary>
public class ProcedureBase : FsmState<ProcedureManager>
{
public override void OnEnter(Fsm<ProcedureManager> fsm)
{
base.OnEnter(fsm);
Debug.Log("进入流程:" + GetType().FullName);
}
public override void OnLeave(Fsm<ProcedureManager> fsm, bool isShutdown)
{
base.OnLeave(fsm, isShutdown);
Debug.Log("离开流程:" + GetType().FullName);
}
}
之后打开ProcedureManager,使其继承ManagerBase,并添加对应的字段与属性,在构造方法里初始化一部分
/// <summary>
/// 流程管理器
/// </summary>
public class ProcedureManager : ManagerBase{
/// <summary>
/// 状态机管理器
/// </summary>
private FsmManager m_FsmManager;
/// <summary>
/// 流程的状态机
/// </summary>
private Fsm<ProcedureManager> m_ProcedureFsm;
/// <summary>
/// 所有流程的列表
/// </summary>
private List<ProcedureBase> m_procedures;
/// <summary>
/// 入口流程
/// </summary>
private ProcedureBase m_EntranceProcedure;
/// <summary>
/// 当前流程
/// </summary>
public ProcedureBase CurrentProcedure
{
get
{
if (m_ProcedureFsm == null)
{
Debug.LogError("流程状态机为空,无法获取当前流程");
}
return (ProcedureBase)m_ProcedureFsm.CurrentState;
}
}
public override int Priority
{
get
{
return -10;
}
}
public ProcedureManager()
{
m_FsmManager = FrameworkEntry.Instance.GetManager<FsmManager>();
m_ProcedureFsm = null;
m_procedures = new List<ProcedureBase>();
}
public override void Init()
{
}
public override void Shutdown()
{
}
public override void Update(float elapseSeconds, float realElapseSeconds)
{
}
}
添加流程的相关方法
/// <summary>
/// 添加流程
/// </summary>
public void AddProcedure(ProcedureBase procedure)
{
if (procedure == null)
{
Debug.LogError("要添加的流程为空");
return;
}
m_procedures.Add(procedure);
}
/// <summary>
/// 设置入口流程
/// </summary>
/// <param name="procedure"></param>
public void SetEntranceProcedure(ProcedureBase procedure)
{
m_EntranceProcedure = procedure;
}
添加创建流程状态机的方法
/// <summary>
/// 创建流程状态机
/// </summary>
public void CreateProceduresFsm()
{
m_ProcedureFsm = m_FsmManager.CreateFsm(this, "", m_procedures.ToArray());
if (m_EntranceProcedure == null)
{
Debug.LogError("入口流程为空,无法开始流程");
return;
}
//开始流程
m_ProcedureFsm.Start(m_EntranceProcedure.GetType());
}
怎么样,是不是很简单呢?因为我们在编写Fsm时已经把Procedure需要的大部分东西都写好了
接下来,就需要测试一下我们编写的Procedure模块能不能跑通
在工程根目录新建一个Test文件夹,在其中再新建一个Procedure文件夹,用来存放测试模块需要的文件。
新建一个ProcedureTestMain测试脚本,然后新建一个场景,在场景中新建一个名为Main的空物体,把脚本挂上去,保存场景为test
然后新建3个测试用的流程类
分别打开3个流程类,使其继承ProcedureBase,并重写OnUpdate,添加切换状态的代码
public class Procedure_Start : ProcedureBase
{
public override void OnUpdate(Fsm<ProcedureManager> fsm, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(fsm, elapseSeconds, realElapseSeconds);
if (Input.GetMouseButtonDown(0))
{
ChangeState<Procedure_Play>(fsm);
}
}
}
public class Procedure_Play : ProcedureBase
{
public override void OnUpdate(Fsm<ProcedureManager> fsm, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(fsm, elapseSeconds, realElapseSeconds);
if (Input.GetMouseButtonDown(0))
{
ChangeState<Procedure_Over>(fsm);
}
}
}
public override void OnUpdate(Fsm<ProcedureManager> fsm, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(fsm, elapseSeconds, realElapseSeconds);
if (Input.GetMouseButtonDown(0))
{
ChangeState<Procedure_Start>(fsm);
}
}
打开我们的测试脚本,在Start方法里编写添加流程,启动流程状态机的代码
public class ProcedureTestMain : MonoBehaviour {
private void Start()
{
ProcedureManager procedureManager = FrameworkEntry.Instance.GetManager<ProcedureManager>();
//添加入口流程
Procedure_Start entranceProcedure = new Procedure_Start();
procedureManager.AddProcedure(entranceProcedure);
procedureManager.SetEntranceProcedure(entranceProcedure);
//添加其他流程
procedureManager.AddProcedure(new Procedure_Play());
procedureManager.AddProcedure(new Procedure_Over());
//创建流程状态机
procedureManager.CreateProceduresFsm();
}
}
这样测试脚本就编写完成了,启动游戏,点击3下鼠标,看看测试效果吧