一种用于对象的状态切换系统和方法与流程

文档序号:21454068发布日期:2020-07-10 17:48阅读:179来源:国知局
一种用于对象的状态切换系统和方法与流程

本发明实施例涉及计算机技术领域,尤其涉及一种用于对象的状态切换系统和方法。



背景技术:

unity目前主要通过动画状态机来播放动画,一个游戏对象通常需要一个逻辑管理器管理逻辑状态(移动,攻击等),需要一个动画状态机来播放逻辑状态对应的当前动画例如跑步、技能动画。逻辑管理器通常是一个循环,每一帧先更新逻辑状态,再更新动画状态,下一帧继续上述内容。当从一个逻辑状态切换到下一个状态时的流程如下:1、开始切换状态,记录下一个状态的id,设置动画状态机的动画id,动画状态机开始做动画的融合过渡。2、逻辑管理器的循环中每一帧检动画状态机动画过渡是否完成,如果否则下一帧继续检测,直至完成。完成之后更新当前逻辑状态。3、更新下一个逻辑状态。

由此可见,现有技术中逻辑状态切换时逻辑状态和动画状态相互影响,如果当动画过渡时记录id的变量被改变,或者动画状态机出现一些情况(例如被重置或者触发优先级更高的切换覆盖原来的过渡)会导致状态切换出现问题。其次,由于逻辑状态和动画状态的更新有时序状态,需要上层逻辑实现者对底层代码实现有深刻的认识和理解。



技术实现要素:

本发明实施例提供了一种用于对象的状态切换系统和方法,以实现将逻辑状态切换和动画切换解耦,简化逻辑状态切换层的代码开发复杂度及执行逻辑。

第一方面,本发明实施例提供了一种用于对象的状态切换系统,包括逻辑状态模块、衔接模块和动画模块,其中:

所述逻辑状态切换模块,用于获取待切换逻辑状态,以及根据所述待切换逻辑状态进行逻辑状态的切换;

所述衔接模块,封装有所述动画模块中的执行接口,用于转发所述逻辑状态模块和/或所述动画模块的事件;

所述动画模块,用于进行动画切换。

可选的,所述衔接模块具体用于:

在检测到逻辑切换指令时,触发所述动画模块进行动画切换,并接收所述动画模块返回的切换完成状态;

将接收到的动画切换完成状态发送至所述逻辑状态切换模块。

可选的,所述衔接模块具体用于:

在当前逻辑状态更新为所述待切换逻辑状态后,向所述动画模块发送动画结束指令,并接收所述动画模块发送的动画过渡完成状态;

将所述动画过渡完成状态发送至所述逻辑状态切换模块,以结束当前逻辑状态。

可选的,所述逻辑状态切换模块具体用于:

获取逻辑状态队列中队首的逻辑状态作为待切换逻辑状态。

第二方面,本发明实施例还提供了一种状态切换方法,由本发明任意实施例所提供的状态切换系统执行,其特征在于,包括:

逻辑状态切换模块从逻辑状态队列中获取待切换逻辑状态;

逻辑状态切换模块通过衔接模块触发动画模块进行动画切换,并接收所述衔接模块返回的动画切换完成状态;

逻辑状态切换模块将当前逻辑状态更新为所述待切换逻辑状态,完成状态的切换。

可选的,所述逻辑状态切换模块通过衔接模块触发动画模块进行动画切换,并接收所述衔接模块返回的动画切换完成状态,包括:

在检测到逻辑切换指令时,所述衔接模块触发所述动画模块进行动画切换;

所述动画模块执行动画切换操作,并在动画切换完成后,向所述衔接模块发送动画切换完成状态;

所述衔接模块将接收到的动画切换完成状态发送至所述逻辑状态切换模块。

可选的,所述逻辑状态切换模块将当前逻辑状态更新为所述待切换逻辑状态,完成逻辑状态的切换,包括:

所述逻辑状态切换模块将当前逻辑状态更新为所述待切换逻辑状态,调用所述衔接模块发送动画结束指令;

所述动画模块根据接收到的动画结束指令结束当前动画,并在当前动画结束过渡完成后向所述衔接模块发送动画过渡完成状态;

所述衔接模块根据将接收到的所述动画过渡完成状态发送至所述逻辑状态切换模块,结束当前逻辑状态。

可选的,在完成逻辑状态的切换之后,还包括:

将所述切换的逻辑状态放入状态池中。

可选的,所述逻辑状态切换模块从逻辑状态队列中获取待切换逻辑状态,包括:

所述逻辑状态切换模块将所述逻辑状态队列中队首的逻辑状态作为所述待切换逻辑状态。

可选的,还包括:

所述逻辑状态切换模块从状态池中获取下一个逻辑状态,并将所述逻辑状态放入所述逻辑状态队列中。

本发明实施例提供的用于对象的状态切换系统包括逻辑状态模块、衔接模块和动画模块,其中:所述逻辑状态切换模块,用于获取待切换逻辑状态,以及根据所述待切换逻辑状态进行逻辑状态的切换;所述衔接模块,封装有所述动画模块中的执行接口,用于转发所述逻辑状态模块和/或所述动画模块的事件;所述动画模块,用于进行动画切换,通过使用衔接模块转发逻辑状态模块和/或动画模块的事件,实现了将逻辑状态切换模块和动画模块解耦,简化了逻辑状态切换层的代码开发复杂度及执行逻辑。

附图说明

图1a是本发明实施例一所提供的一种状态切换系统的结构示意图;

图1b是本发明实施例一所提供一种状态切换系统的架构图;

图2是本发明实施例二所提供的一种状态切换方法的流程图。

具体实施方式

下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。

实施例一

图1a是本发明实施例一所提供的一种逻辑状态切换系统的结构示意图。本实施例可适用于对对象进行状态切换时的情形,尤其适用于对游戏对象进行状态切换时的情形。如图1a所示,所述系统包括逻辑状态模块110、衔接模块120和动画模块130,其中:

所述逻辑状态切换模块110,用于获取待切换逻辑状态,以及根据所述待切换逻辑状态进行逻辑状态的切换;

所述衔接模块120,封装有所述动画模块中的执行接口,用于转发所述逻辑状态模块和/或所述动画模块的事件;

所述动画模块130,用于进行动画切换。

在本实施例中,通过使用一个可复用的中间层soc结构(separationofconcernsarchitecture),即衔接模块,来分离逻辑状态和动画状态,使逻辑状态和动画状态解耦,逻辑状态切换的代码开发汇中开发者无需知道底层动画状态的细节,只需关心上层逻辑即可。并且在逻辑初始化的时候提供了动画名的校验机制。

可选的,在逻辑状态切换模块中,可以使用队列代替单个状态机,使逻辑状态有更好的扩展性。一个实施例中,所述逻辑状态切换模块具体用于:获取逻辑状态队列中队首的逻辑状态作为待切换逻辑状态。其中,可以将逻辑状态(logicstate)作为队列中的最小单位,并提供了多个回调方法,如onenqueue、onstart、onrealstart、onlogicend、onexit等回调方法。

在衔接模块中,封装动画模块的执行接口,并且转发事件,方便断点调试。衔接模块中封装的一些动画模块常用接口包括:setfloat、setint、setbool等接口。在衔接模块中的每一种logicstate都对应一个唯一的动画模块中的animationhandler。animatorhandler当中通过包含animationstateinfo的字典记录了animator的动画状态的一些数据,例如name,hashcode等,并且采用一个字典缓存字符串转hashcode,以使后续调用不需要计算哈希值。其id和logicstate里面的id一一对应,每一个logicstate对应一个animationhandler。一一对应的id使得在逻辑初始化时即可进行动画名的校验。

可选的,animationhandler可以有三种子类:

1、singleanihandler

即单一动画的handler,一个逻辑状态对应一个animator的state,开始和结束动画名都是一样的。

2、sequentialanihandler

即串行动画,可以理解为一个逻辑状态对应了好几个连续串行的动画状态,例如起手,keep,后摇等。通常在keep阶段进入reallogicstart。

3、substatemachinehandler

即子状态机的handler,当enter和exit子状态时触发对应回调。

在本发明的一种实施方式中,所述衔接模块具体用于:在检测到逻辑切换指令时,触发所述动画模块进行动画切换,并接收所述动画模块返回的切换完成状态;将接收到的切换完成状态发送至所述逻辑状态切换模块。

可选的,逻辑切换指令可以为逻辑状态切换模块触发。衔接模块检测到逻辑状态切换模块触发的逻辑状态切换指令后,通过逻辑状态中的id确定动画id,并根据动画id触发动画模块进行动画切换,并将接收到动画模块返回的切换完成状态发送至逻辑状态切换模块,以使逻辑状态切换模块执行真正的逻辑切换。

在本发明的一种实施方式中,所述衔接模块具体用于:在当前逻辑状态更新为所述待切换逻辑状态后,向所述动画模块发送动画结束指令,并接收所述动画模块发送的动画过渡完成状态;将所述动画过渡完成状态发送至所述逻辑状态切换模块,以结束当前逻辑状态。

可选的,逻辑状态切换模块执行完真正的逻辑切换后,通过衔接模块向动画模块发送动画结束指令,并根据动画模块的响应结束当前逻辑状态。

动画模块可以扩展自unity原生的statemachinebehaviour作为asset挂在动画模块上,通过动画模块触发回调操作衔接模块中的handler,可以理解为是挂在animator上面的动画脚本。主要作用是当animator的动画状态发生改变时通过不同的事件向外通知动画状态的改变。

可选的,动画模块中进入一个动画状态的流程可以为:预进入→进入→update→预退出,在进入和退出state的时候,清理first和last标记。提供预退出和预进入的回调,可以更加精确的控制状态机的过渡(transition)表现。

图1b是本发明实施例一所提供一种状态切换系统的架构图。如图1b所示,originalstates中存储有不同的原始logicstate对象(出生,攻击,移动等)。状态切换系统包括逻辑状态模块(logicstatequeue)、衔接模块(animationcontroller)和动画模块(monoanimationsmb)。

参照图1b,一个logicstate的生命周期流程可以为:

1)从池pool里拿出下一个逻辑对象状态logicstate放入队列queue中,等待这个对象排到队首。

2、在队首的对象执行start,通过animationcontroller触发最下层monoanimationsmb的动画切换。

3)monoanimationsmb中的animator动画切换完成时通过事件event的方式通知上层,上层开始执行真正的开始逻辑logicrealstart。

4)logicstate执行过程中的update更新。

5)当前状态结束时logicend,调用finishhandler,如果handler有触发器trigger,就通过触发器结束animator的当前动画,当前动画的结束过渡完成后通过stateexit事件通知上层,如果没有触发器trigger则直接通知上层logicstate当前逻辑状态结束。

6)当前的logicstate执行完成,从队列中出去来回收放入池中,等待下次使用。

本发明实施例提供的用于对象的状态切换系统包括逻辑状态模块、衔接模块和动画模块,其中:所述逻辑状态切换模块,用于获取待切换逻辑状态,以及根据所述待切换逻辑状态进行逻辑状态的切换;所述衔接模块,封装有所述动画模块中的执行接口,用于转发所述逻辑状态模块和/或所述动画模块的事件;所述动画模块,用于进行动画切换,通过使用衔接模块转发逻辑状态模块和/或动画模块的事件,实现了将逻辑状态切换模块和动画模块解耦,简化了逻辑状态切换层的代码开发复杂度及执行逻辑。

实施例二

图2是本发明实施例二所提供的一种状态切换方法的流程图。本实施例可适用于对对象进行状态切换时的情形,尤其适用于对游戏对象进行状态切换时的情形。该方法可以由逻辑状态切换装置执行,该逻辑状态切换装置可以采用软件和/或硬件的方式实现,例如,该逻辑状态切换装置可配置于逻辑状态切换设备中。如图1所示,所述方法包括:

s110、逻辑状态切换模块从逻辑状态队列中获取待切换逻辑状态。

在本实施例中,使用队列代替现有技术中的单个状态机,相对于现有技术来说,有更好的扩展性。逻辑状态切换模块从状态池中获取下一个逻辑对象状态,并将逻辑对象状态放入逻辑状态队列中,等待这个对象排到队首。

一个实施例中,所述逻辑状态切换模块从逻辑状态队列中获取待切换逻辑状态,包括:所述逻辑状态切换模块将所述逻辑状态队列中队首的逻辑状态作为所述待切换逻辑状态。示例性的,若逻辑状态队列中队首的逻辑状态为“attack”,则将“attack”作为当前待切换逻辑状态。

s120、逻辑状态切换模块通过衔接模块触发动画模块进行动画切换,并接收所述衔接模块返回的动画切换完成状态。

在本实施例中,在队首的对象执行start,通过衔接模块触发最下层的动画模块进行动画切换。

一个实施例中,所述逻辑状态切换模块通过衔接模块触发动画模块进行动画切换,并接收所述衔接模块返回的动画切换完成状态,包括:在检测到逻辑切换指令时,所述衔接模块触发所述动画模块进行动画切换;所述动画模块执行动画切换操作,并在动画切换完成后,向所述衔接模块发送动画切换完成状态;所述衔接模块将接收到的动画切换完成状态发送至所述逻辑状态切换模块。

参考图1b,在队首的对象执行start,通过animationcontroller触发最下层monoanimationsmb的动画切换,并在monoanimationsmb中的animator动画切换完成时通过事件event的方式通知逻辑状态切换模块,逻辑状态切换模块开始执行真正的开始逻辑logicrealstart。

s130、逻辑状态切换模块将当前逻辑状态更新为所述待切换逻辑状态,完成状态的切换。

逻辑状态切换模块将逻辑状态更新为待切换逻辑状态后,结束当前动画,完成状态的切换。

一个实施例中,所述逻辑状态切换模块将当前逻辑状态更新为所述待切换逻辑状态,完成逻辑状态的切换,包括:所述逻辑状态切换模块将当前逻辑状态更新为所述待切换逻辑状态,调用所述衔接模块发送动画结束指令;所述动画模块根据接收到的动画结束指令结束当前动画,并在当前动画结束过渡完成后向所述衔接模块发送动画过渡完成状态;所述衔接模块根据将接收到的所述动画过渡完成状态发送至所述逻辑状态切换模块,结束当前逻辑状态。

参考图1b,当前状态结束时logicend,调用finishhandler,如果handler有触发器trigger,就通过触发器结束animator的当前动画,当前动画的结束过渡完成后通过stateexit事件通知上层,如果没有触发器trigger则直接通知上层logicstate当前逻辑状态结束。

在上述方案的基础上,在完成逻辑状态的切换之后,还包括:将所述切换的逻辑状态放入状态池中。可选的,当前的逻辑状态执行完成后,从队列中出去来回收放入池中,等待下次使用。

本发明实施例通过逻辑状态切换模块从逻辑状态队列中获取待切换逻辑状态;逻辑状态切换模块通过衔接模块触发动画模块进行动画切换,并接收所述衔接模块返回的动画切换完成状态;逻辑状态切换模块将当前逻辑状态更新为所述待切换逻辑状态,完成状态的切换,通过使用衔接模块转发逻辑状态模块和/或动画模块的事件,实现了将逻辑状态切换模块和动画模块解耦,简化了逻辑状态切换层的代码开发复杂度及执行逻辑。

注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1