简单的有限状态机

首先列举出所有状态的枚举

public enum StateType

{

Idle = 0,

Run  = 1,

//...

}

状态基类

public class BaseState
{
    public StateType stateId;


    protected Animation anim;


    public virtual void init(Animation anim)
    {
        this.anim = anim;
    }


    /// <summary>
    /// 被添加到状态机之后调用
    /// </summary>
public virtual void OnRegister() { }
    /// <summary>
    /// 进入
    /// </summary>
    /// <param name="info"></param>
    public virtual void Enter(System.Object info = null) { }
    /// <summary>
    /// 退出
    /// </summary>
    /// <param name="nextStateID"></param>
    public virtual void Exit(StateType nextStateID) { }


}

//...z子类

public class IdleState : BaseState

{

//......

}

// Runstate : BaseState


//最后  状态机控制器

public class FSM

{

public Dictionary<StateType, BaseState> stateDic = new Dictionary<StateType, BaseState>();//注册的状态列表

public BaseState curState;//当前状态

public Animation anim;

    public FSM(Animation anim)
    {
        this.anim = anim;
    }

/// <summary>
    /// 添加状态
    /// </summary>
    /// <param name="s">具体状态</param>
    public void AddState(BaseState s)
    {
        if (FindState(s.stateId) == null)
        {
            stateDic[s.stateId] = s;
            s.init(this.anim);
            s.OnRegister();
        }
    }


    /// <summary>
    /// 查找状态
    /// </summary>
    /// <param name="s">状态id</param>
    public BaseState FindState(StateType stateID)
    {
        if (stateDic.ContainsKey(stateID))
        {
            return stateDic[stateID];
        }
        return null;
    }


    /// <summary>
    /// 删除状态
    /// </summary>
    /// <param name="s">状态id</param>
    public void RemoveState(StateType stateID)
    {
        if (stateDic.ContainsKey(stateID))
        {
            stateDic.Remove(stateID);
        }
    }


    /// <summary>
    /// 状态机切换状态
    /// </summary>
    /// <param name="stateID">状态id</param>
    /// <param name="info">状态机携带参数.传入状态的Enter()方法</param>
    public void SwitchState(StateType stateID, System.Object info = null)
    {
        if (curState!= null)
        {
            curState.Exit(stateID);
        }
        BaseState nextState = FindState(stateID);
        if (nextState != null)
        {
            curState= nextState;
            curState.Enter(info);
        }
    }


    /// <summary>
    /// 是否当前状态
    /// </summary>
    /// <param name="stateID">=状态id</param>
    /// <returns>是则返回true</returns>
    public bool IsCurrStateID(StateType stateID)
    {
        if (curState == null)
        {
            return false;
        }
        else
        {
            return curState.stateId == stateID;
        }
    }

}

//完成 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值