unity游戏开发-简易的状态机

本文探讨了如何使用状态机优化Unity游戏中的怪物行为逻辑,通过将复杂的业务需求拆分为多个独立状态,减少代码冗余,提高代码可读性和维护性。详细分析了普通实现的缺点,并提供了状态机的实现方式,使得状态迁移关系更加清晰明了。

本篇主要分享一个简易状态机的实现。

目录

状态机

应用例子

业务需求

普通实现

缺点分析

状态机实现

优点分析


状态机

简单点讲状态机其实就是将一个具体的业务拆分为几个小的状态,状态之间由一定的条件来达成迁移。

因此对一个状态机而言,有两块内容:状态机、状态。

状态机管理着各个状态,控制状态之间的迁移,提供状态间迁移的注册方法,而状态只用处理自身的逻辑即可。

另外,不论是状态或者状态机都必须有明确的生命周期:开始、执行中、结束。

using System.Collections.Generic;

// 状态
public abstract class IState
{
    // 所属状态机
    protected IStateMachine mMachine;
    // 初始化
    public void Init(IStateMachine machine)
    {
        mMachine = machine;
    }
    // 开启当前状态
    public void DoStart(string key = null)
    {
        mMachine.curState = this;
        OnStart(key);
    }
    public abstract void OnStart(string key = null);
    // 当前状态定时器
    public abstract void DoUpdate();
    // 结束当前状态
    public void DoEnd(string key = null)
    {
        OnEnd();
        mMachine.DoEnd(key);
    }
    protected abstract void OnEnd();
}

public abstract class IStateMachine
{
    // 当前状态
    public IState curState;
    // 转换关系集合
    protected Dictionary<IState, Dictionary<string, IState>> mTransition = new Dictionary<IState, Dictionary<string, IState>>();

    // 添加转换关系
    protected void AddTransition(IState beforeState, IState afterState, string key)
    {
        if (!mTransition.TryGetValue(beforeState, out var dicAfterStates))
        {
            dicAfterStates = new Dictionary<string, IState>();
            mTransition.Add(beforeState, dicAfterStates);
        }
        dicAfterStates.Add(key, afterState);
    }

    // 开启状态机
    public void DoStart(string key = null)
    {
        // 若当前有状态执行中则结束当前状态
        if (curState != null)
        {
            curState.DoEnd("interupt");
        }

        OnStart(key);
    }

    // 结束当前状态
    public void DoEnd(string key = null)
    {
        // 获取下一个状态
        if (mTransition.TryGetValue(curState, out var dicAfterStates))
        {
            if (dicAfterStates.TryGetValue(key, out var afterState))
            {
                afterState.DoStart(key);
                return;
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值