有限状态机、FSM,会经常说到,那它究竟是什么?
有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态机并不是一种算法,而是一种设计模式–状态模式。
状态模式是什么?
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。
状态模式详解 解释的非常到位
FSM框架封装
如果不做任何处理的话,切换动画的话,一般就是直接animator.setXXX(),这样切换动画,耦合性高,可扩展性差,硬伤。几个动画还好,动画多了。。再来个什么判定,这种切换是很麻烦的
我们可以加一个管理器来降低耦合,但是扩展性还是不好,很多需求还是没法满足
结合状态模式,让每一个状态去继承FSMBase,在各自的状态里扩展需求
FSMBase
就像点击拖拽一样,切换动画也可以分为Enter、Stay、Exit三种状态,OnEnter子类必须实现,在这个方法里animator.setXXX(),另外两种状态写成虚函数。
当然你还可以继续扩充其他状态。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class FSMBase
{
//进入这个状态
public abstract void OnEnter();
//正处在这个状态
public virtual void OnStay()
{
}
//退出这个状态
public virtual void OnExit()
{
}
}
FSMManager
首先用一个数组把所需要的状态给存到管理器中,在管理器中进行状态的切换,更新。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FSMManager
{
//把所有基类存起来
FSMBase[] allState;
//记录当前的状态值
int curIndex;
//记录当前有多少个状态
int topIndex;
public FSMManager(int nub)
{
//初始化这个账本
allState = new FSMBase[nub];
//-1表示没有前一个状态
curIndex = -1;
topIndex = -1;
}
//提供一个接口 添加新状态
public void AddState(FSMBase myState)
{
//如果满了 return
if (topIndex>=allState.Length-1)
{
return;
}
topIndex++;
allState[topIndex] = myState;
}
public void ChangeState(int index)
{
//如果要切换的状态,和当前状态一致,就没必要切换
if (curIndex==index)
{
return;
}
//如果有前一个状态
if (curIndex!=-1)
{
//前一个状态退出
allState[curIndex].OnExit();
}
//切换要切换的状态
curIndex = index;
//当前状态进入
allState[curIndex].OnEnter();
}
public void Update()
{
if (curIndex != -1) {
//一直运行在当前状态
allState[curIndex].OnStay();
}
}
先讲到这里接下来的一篇,结合框架,举一个简单的例子