AI之有限状态机
----什么是有限状态机-----------------------------------
有限状态机拥有有限数量的状态,并且每一个状态可以切换到0个或多个状态,输入决定了下一个状态的迁移。
有限状态机分为两种:确定性非确定性,并且非确定性的有限状态机可以转换为确定性有限状态机。
----对于有限状态机的考虑-----------------------------
例如被攻击后转向敌人,释放技能后切换到休息状态,如果敌人过于强大会逃跑,这些问题首先直观的使用if else语句,可以这样但是通常非常难以写出来,而且的修改会很麻烦,这时候可用使用“有限状态机”来解决。
----模块设计-------------------------------------------
State:是有限状态机的基类,它是一个抽象类,其中包含了一些通用的成员和方法。作为一个基类,是可以被子类继承的,所以方法是virtual的,以便于实现多态。使用时可以继承自State,可以override基类的OnEnter / OnTick / OnExit 等方法实现个性化的一些操作。
public abstract class State
{
protected State(Character character)
{
Character = character;
}
public Character Character { get; private set; }
public virtual void OnEnter()
{
}
public virtual State OnTick()
{
return this;
}
public virtual void OnExit()
{
}
}
public class Idle : State
{
public Idle(Character character)
: base(character)
{
}
public override State OnTick()
{
Character.Play(Character.Idle);
return this;
}
} ----具体实现-------------------------------------------
public abstract class Character : MonoBehaviour
{
private State state;
//表示当前状态
public State State
{
get
{
return state;
}
protected set
{
if (state == null)
state = new Idle(this);
if (state != value)
{
var old_state = state;
state = value;
//通知状态切换
OnStateChanged(state, old_state);
//调用上一个状态的退出方法
old_state.OnExit();
//进入当前当前状态
state.OnEnter();
}
}
}
protected virtual void OnStateChanged(State new_state, State old_state)
{
}
void Update()
{
if (State != null)
//在每一帧调用当前状态的OnTick方法,根据其返回值切换状态
State = State.OnTick();
}
}