QFramework 内置了一个简易的状态机,基本使用如下:
链式
using UnityEngine;
namespace QFramework.Example
{
public class IStateBasicUsageExample : MonoBehaviour
{
public enum States
{
A,
B
}
public FSM<States> FSM = new FSM<States>();
void Start()
{
FSM.State(States.A)
.OnCondition(()=>FSM.CurrentStateId == States.B)
.OnEnter(() =>
{
Debug.Log("Enter A");
})
.OnUpdate(() =>
{
})
.OnFixedUpdate(() =>
{
})
.OnGUI(() =>
{
GUILayout.Label("State A");
if (GUILayout.Button("To State B"))
{
FSM.ChangeState(States.B);
}
})
.OnExit(() =>
{
Debug.Log("Enter B");
});
FSM.State(States.B)
.OnCondition(() => FSM.CurrentStateId == States.A)
.OnGUI(() =>
{
GUILayout.Label("State B");
if (GUILayout.Button("To State A"))
{
FSM.ChangeState(States.A);
}
});
FSM.StartState(States.A);
}
private void Update()
{
FSM.Update();
}
private void FixedUpdate()
{
FSM.FixedUpdate();
}
private void OnGUI()
{
FSM.OnGUI();
}
private void OnDestroy()
{
FSM.Clear();
}
}
}
运行之后,结果如下:
没啥问题。
类模式
链式适合在快速开发阶段,或者在状态非常少的阶段使用。
而如果状态较多,或者相应代码量较多的阶段,可以使用类模式,代码如下:
using UnityEngine;
namespace QFramework.Example
{
public class IStateClassExample : MonoBehaviour
{
public enum States
{
A,
B,
C
}
public FSM<States> FSM = new FSM<States>();
public class StateA : AbstractState<States,IStateClassExample>
{
public StateA(FSM<States> fsm, IStateClassExample target) : base(fsm, target)
{
}
protected override bool OnCondition()
{
return mFSM.CurrentStateId == States.B;
}
public override void OnGUI()
{
GUILayout.Label("State A");
if (GUILayout.Button("To State B"))
{
mFSM.ChangeState(States.B);
}
}
}
public class StateB: AbstractState<States,IStateClassExample>
{
public StateB(FSM<States> fsm, IStateClassExample target) : base(fsm, target)
{
}
protected override bool OnCondition()
{
return mFSM.CurrentStateId == States.A;
}
public override void OnGUI()
{
GUILayout.Label("State B");
if (GUILayout.Button("To State A"))
{
mFSM.ChangeState(States.A);
}
}
}
private void Start()
{
FSM.AddState(States.A, new StateA(FSM, this));
FSM.AddState(States.B, new StateB(FSM, this));
// 支持和链式模式混用
// FSM.State(States.C)
// .OnEnter(() =>
// {
//
// });
FSM.StartState(States.A);
}
private void OnGUI()
{
FSM.OnGUI();
}
private void OnDestroy()
{
FSM.Clear();
}
}
}
运行之后结果如下。
关于状态机的介绍就到这里。
更多内容
- 转载请注明地址:liangxiegame.com (首发) 微信公众号:凉鞋的笔记
- QFramework 主页:qframework.cn
- QFramework 交流群: 623597263
- QFramework Github 地址: https://github.com/liangxiegame/qframework
- QFramework Gitee 地址:https://gitee.com/liangxiegame/QFramework
- GamePix 独立游戏学院 & Unity 进阶小班地址:https://www.gamepixedu.com/