Unity2D项目-平台、解谜、战斗! 1.4状态控制组件

各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊。

接上文,我们已经说明了主角的移动组件的基本设计,接下来我们要考虑主角在不同状态下能够执行那些动作,哪些状态转换是有效的,哪些状态转换是无效的。

在我们的游戏中,我们的主角可能有以下几种状态:

    public enum PlayerControlStatus { Normal, Crouch, Casting, AbilityWithMovement, AbilityNeedControl, Interrupt, Stun}

其中,Normal表示行走、跳跃、下落状态的集合;Crouch表示下蹲状态,是一种特殊的状态;Casting表示主角正在施法状态;AbilityWithMovement表示当前主角正处于技能释放状态,并且该技能有位移功能;AbilityNeedControl表示主角正在处于技能释放状态,但是主角在技能释放过程中可以接受玩家的移动控制。Interrupt和Stun表示主角受到了打断和眩晕,处于控制状态。

可以看到,主角能够进行的所有“动作”,都以一种对应的“状态”表示了出来,主角正在进行何种动作对应了当前状态的一个变量取值。能否执行下一个动作(或是玩家主动控制的,或是主角受到某种),取决于当前状态(或者叫动作)的取值。可以说,这是一个典型的状态机模型,输入为玩家要进行的下一个动作,输出为一个boolean值以及当前状态的转变,这个boolean值表示当前状态能否转变为目标状态。我们可以根据这个返回值来判断我们能否执行状态转变所代表的动作,比如,在Normal状态下,主角想要请求释放技能,那么首先需要请求状态组件能否进行状态转变,如果返回为ture,那么状态已经发生改变,可以在其他组件中执行技能释放逻辑。

我们用一个状态转移矩阵表示这些状态能够相互转移与否

 当我们从外部请求状态改变时,比如我们想要执行“冲刺”技能,我们首先申请状态能否转变为AbilityWithMovement,如果返回值为true,则申请一个冲刺移动,比如在0.3s内移动至相对位置Vector2(3, 0)的位置,对应上文移动模块,移动模块就会把这个位移记录在技能位移中,并在接下来的0.3s中执行这个移动请求。

除了一组互斥的状态,主角可能还有一些诸如是否在地面上、是否在水中、是否贴墙、是否处于受击无敌等状态,这些状态并不是有关控制输入的状态机的关键变量,但也影响着某些动作的执行逻辑,比如如果我们在空中,跳跃次数达到上限时我们便不能再执行跳跃动作,等到主角回到地面上,我们再将跳跃次数刷新;再比如在水中,我们的跳跃不再是起跳动作而是上浮动作,等等此类。

这些状态即可以设计在一个状态控制组件中统一管理,也可以设计在各个功能实现模块中分散管理,看官各取所需,不在一一赘述。

至此,我们对主角的关键功能模块设计——移动和状态控制进行了详细的阐述,接下来,我们将针对主角的一些其他功能,比如技能释放、自动拾取等功能的设计及实现进行更多的描述。

 

感谢您阅读到这里!那么今天的分享就是这些,欢迎访问:

 

整个项目原型github地址:

 www.gitHub.com/yunshiyue/elementgame

 

看官有何见解,有何指点,欢迎留言,也欢迎私聊~

posted @ 2021-04-15 19:08  脸脸爱编程  阅读(161)  评论(0编辑  收藏  举报