**状态:表示为某种一种状态执行的结果!!!
状态机 :用来执行具体状态单元以及使用当前状态的数据驱动
状态机 与 单元状态 就像 枪 与 不同类型的子弹
状态之间的转换通过特定的条件,通过状态机去改变状态,要执行的状态要通过状态机来进行执行
我们此前的学习一些操作比如 跑 与 站立的转换。在这里我们把他们分别的使用 单元状态打包 利用状态机去执行而已。
**
/// <summary>
/// 状态执行机-----------基类(可以根据该执行机拓展 写出具体需要的执行机)
/// </summary>
public class FSM
{
StateBase current = null; //当前状态
StateBase preview = null; //之前状态
StateData data = null; //数据
/// <summary>
/// 状态机启动
/// </summary>
public void Start(StateBase state, ref StateData currentData, ref StateData previewData)
{
Change(state, ref currentData, ref previewData);
}
/// <summary>
/// 状态机持续执行
/// </summary>
public void Update()
{
if (current == null)
{
return;
}
else
{
current.Stay(data);
}
}
/// <summary>
/// 改变状态
/// </summary>
/// <param name="state"></param>
/// <param name="preview"></param>
/// <param name="data"></param>
public void Change(StateBase state, ref StateData currentData, ref StateData previewData)
{
if (current != null && state.ID == current.ID)
{
return;
}
if (preview != null)
{
preview.Exit(previewData);
}
preview = current;
current = state;
data = currentData;
current.Enter(data);
}
/// <summary>
/// 状态机停止执行
/// </summary>
public void End()
{
current.Exit(data);
current = null;
}
/// <summary>
/// 单元状态---------------基类(子类单元状态可以按需求 进行拓展)
/// </summary>
public abstract class StateBase
{
public abstract int ID { get; }
public abstract void Enter(StateData data);
public abstract void Stay(StateData data);
public abstract void Exit(StateData data);
}
/// <summary>
/// 站立状态-------------子类 继承 StateBase
/// </summary>
public class StateIdel : StateBase
{
public override int ID => 0;
public override void Enter(StateData data)
{
data.animator.speed = 1;
}
public override void Exit(StateData data)
{
data.animator.speed = 0;
}
public override void Stay(StateData data)
{
data.animator.SetBool("Run",false);
}
}