天天看点

有限状态机FSM详解(三)

这篇讲解如何使用第二篇中写好的类。

我们使用的是游戏角色的移动、跳跃、攻击、待机四个状态来讲,那么我们要构建出这四个状态,需要设计的模型是什么呢?

需要设计一个角色类、一个驱动角色实例的运行环境<Unity的MonoBehaviour就行了>。

那我们设计角色类,角色类中持有四个状态类的实例、一个状态机实例。

首先是四个状态类:

    移动状态类(继承State类)

        移动状态类中持有:

            移动状态到跳跃的状态转换实例、移动状态到攻击的状态转换实例、移动状态到待机的状态转换实例

            其中移动状态到跳跃状态需要考虑设计是否能在移动状态中跳跃,是否能在移动状态中实行攻击,是否能在移动状态中待机(当然不能在移动状态中待机了,边移动边待机是什么鬼)。

    跳跃状态类(继承State类)

        跳跃状态类中持有:

            跳跃状态到其他三个状态类的转换实例

    攻击状态类(继承State类)

        攻击状态类中持有:

            攻击状态到其他三个状态类的转换实例

    待机状态类(继承State类)

        待机状态类中持有:

            待机状态到其他三个状态类的转换实例

        然后在每个状态转换类中写判断条件,一般需要持有外部的判断对象,所以需要把外部的判断对象传入,比如实现这几个状态的转换判断,我们给角色类设计一个接受外部输入的属性<string keyBoard>,那么我们就要把角色类的实例传入所有状态转换实例中去,通过判断角色类的<keyBoard>属性做出转换状态的判断。

        然后我们要在角色类的初始化中,把这些状态类、状态转换类、状态机类都初始化完。然后驱动状态机开始运行。于是整个状态机就跑起来了。

        但是这样大家发现一个问题没有,就是状态越多,状态转换越多,并且是呈 n*(n-1)增长,虽然后面好维护,但是这样写的话,也会使状态转换类越来越多。我正在思考怎么减少这些状态转换类的数量。欢迎大家提出意见和建议,一起提高。

这篇把使用原理讲了,下篇给代码。

继续阅读