Unity中的状态机

Untiy状态机框架

这套框架泛用性比较强但是需要重写的代码比较多
状态携带的数据基类
这个类中所需要携带的属性可以自己添加,这里只是简单示范,携带了一个Animator动画机和Nav导航组件
可以根据需要自己更改,Excute函数是接收这个数据的状态在运行时主要调用的函数,在这里进行处理比较方便,因为可以直接拿到本类的属性

/// <summary>
/// 状态数据基类
/// </summary>
public abstract class StateDataBase
{
    public Animator anim;

    public NavMeshAgent nav;

    protected StateDataBase(Animator anim, NavMeshAgent nav)
    {
        this.anim = anim;
        this.nav = nav;
    }

    public abstract void Excute();
}

状态基类
所有的状态都继承自这个类,所有的逻辑都在这三个函数中实现,包括状态的切换判断以及状态的执行,这里传进来的是上边定义过的状态数据基类,在这里就用到了

public abstract class StateBase 
{
    public abstract int ID { get; }//状态ID用来对比当前状态和上一个状态是否是同一个状态
    public abstract void Enter(StateDataBase data);//第一次进入该状态所执行的逻辑
    public abstract void Excute(StateDataBase data);//此状态执行时的行为
    public abstract void Leave(StateDataBase data);//此状态退时执行的逻辑
   
}

状态机核心类
此类是状态机切换状态的核心类,负责状态的改变和执行,在每个挂载状态机的实体的脚本中都是用此类来实现状态的切换和执行

public class FsmCore 
{
    public StateBase curState;//当前状态
    public StateBase prevState;//上一个状态
    public StateDataBase data;//当前状态携带的数据
    /// <summary>
    /// 改变状态函数
    /// </summary>
    /// <param name="state"></param>
    /// <param name="curData"></param>

    public void ChangeState(StateBase state,StateDataBase curData)
    {
        if (curState != null && curState.ID == state.ID)
        {
            return;
        }
        if (prevState != null)
        {
            prevState.Leave(data);
        }
        data = curData;
        curState = state;
        prevState = curState;
        curState.Enter(data);
    }
    /// <summary>
    /// 状态执行过程
    /// </summary>
    public void Excute()
    {
        if (curState != null)
        {
            curState.Excute(data);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值