Unity FSM(有限状态机)框架的简单封装

有限状态机、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();
        }

    }

先讲到这里接下来的一篇,结合框架,举一个简单的例子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值