发明内容
为解决上述问题,本发明的目的在于提供一种基于行为树的高解耦引导方法及系统,读取当前已完成的引导,获取引导信息;读取配置表,获取下一个待执行引导的引导信息,根据获取的下一个待执行引导的引导信息,读取配置表获取触发条件以及行为路径,判断当前是否满足触发条件行为树配置执行完毕后,将当前执行的引导的完成信息修改为已完成,并返回执行步骤,读取模块用于读取引导信息并根据引导信息选择调用的模块;节点模块用于设置引导判断节点以及编辑引导信息;事件执行模块用于检测是否满足触发条件来加载行为树配置;触发模块用于检测是否满足引导触发条件来执行对应的引导。
本发明解决其问题所采用的技术方案一方面是:一种基于行为树的高解耦引导方法,其特征在于,包括以下步骤:S1、读取当前已完成的引导,获取引导信息,其中引导信息包括引导标识、引导类型、完成信息以及配置表;S2、读取配置表,获取下一个待执行引导的引导信息,若不存在则执行步骤S5;S3、根据获取的下一个待执行引导的引导信息,读取配置表获取触发条件以及行为路径,判断当前是否满足触发条件,若是则根据行为路径加载行为树配置并执行,否则执行外部系统流程;S4、行为树配置执行完毕后,将当前执行的引导的完成信息修改为已完成,并返回执行步骤S1;S5、引导结束,退出流程。
进一步的,所述引导类型包括主线引导和系统引导,其中主线引导为线性引导,系统引导为非线性引导。
进一步的,所述外部系统流程包括:执行监听流程,并读取系统引导机制中的引导触发条件信息;监听游戏运行过程中完成的事件,判断当前是否满足引导触发条件,若满足则读取对应的系统引导,获取引导信息,其中引导信息包括引导标识、引导类型、完成信息以及配置表,否则返回执行监听流程;判断完成信息是否为未完成,若是则执行下一步骤,否则返回执行监听流程;读取配置表获取触发条件以及行为路径,判断当前是否满足触发条件,若是则根据行为路径加载行为树配置并执行,否则返回执行监听流程;行为树配置执行完毕后,将当前执行的引导的完成信息修改为已完成,并返回执行监听流程。
进一步的,所述监听流程还包括:读取下一个待执行引导的引导信息;读取配置表获取触发条件以及行为路径,判断当前是否满足触发条件,若是则根据行为路径加载行为树配置并执行,否则执行外部系统流程。
进一步的,所述步骤S1包括:读取已完成的引导信息,判断是否存在引导类型为主线引导的引导,若存在则执行下一步骤,否则读取引导类型为主线引导且引导顺序最靠前的引导,并获取引导信息;在已完成的引导中读取引导类型为主线引导且引导顺序最靠后的引导,并获取引导信息。
进一步的,所述引导顺序最靠后的引导和所述引导顺序最靠前引导的判断方法为根据引导标识的数字大小判断和根据该引导关联和被关联的关系判断。
本发明解决其问题所采用的技术方案另一方面是:一种基于行为树的高解耦引导系统,其特征在于,包括:读取模块,用于读取引导信息并根据引导信息选择调用的模块;节点模块,用于设置引导判断节点以及编辑引导信息;事件执行模块,用于检测是否满足触发条件来加载行为树配置;触发模块,用于检测是否满足引导触发条件来执行对应的引导。
进一步,还包括主线引导判断模块,用于根据读取模块获取的信息判断是否还有未完成的主线引导。
进一步,所述读取模块还包括引导信息分析模块,用于根据引导类型选择执行对应的模块,若引导类型为主线引导,则调用主线引导判断模块,若引导类型为系统引导,则调用触发模块。
进一步,还包括监听模块,用于记录游戏运行中所有数据变化,包括但不限于发生的事件、角色等级变换以及UI界面的切换。
本发明的有益效果是:方便引导配置人员扩展引导,避免在其他模块硬插代码从而拥有高解耦特性,引导模块足够独立抽象因而具有可移植性和可维护性,方便策划直接对游戏事件进行修改,在出现bug的时候容易快速具体定位到问题,测试成本低。
具体实施方式
以下将结合实施例和附图对本发明的构思、具体结构及产生的技术效果进行清楚、完整的描述,以充分地理解本发明的目的、方案和效果。
需要说明的是,如无特殊说明,本公开中所使用的上、下、左、右等描述仅仅是相对于附图中本公开各组成部分的相互位置关系来说的。在本公开中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。此外,除非另有定义,本文所使用的所有的技术和科学术语与本技术领域的技术人员通常理解的含义相同。本文说明书中所使用的术语只是为了描述具体的实施例,而不是为了限制本发明。
本文所提供的任何以及所有实例或示例性语言(“例如”、“如”等)的使用仅意图更好地说明本发明的实施例,并且除非另外要求,否则不会对本发明的范围施加限制。
本方案结构主要分为二个部分:第一部分是引导设计整体流程概述;第二部分是引导具体实现模块概述;下面是各部分的具体描述。
引导配置结构:
每个引导的执行部分都是一颗行为树,由和功能相关一系列的节点组成,节点包含本身行为树自带拥有的复合节点,还包括需自行实现和需求相关的条件节点和行为节点。策划可以在可视化编辑界面中通过组合这些节点来配置一颗行为树。
每个引导都有独一无二的引导id,引导中的信息数据在guide配表中配置,每行引导关键字段有guideID(记录引导唯一的id),guidePath(关联该引导对应执行的行为树路径),guideType(引导的类型标记,1是主线引导,2是系统引导等),list(引导的触发条件列表,满足该条件列表所有条件可以触发该引导),completeCond(引导自动完成机制,用于主线引导中满足条件则自行跳过该引导步骤)。
引导类型:
引导类型划分成主线和系统引导,目的是为了实现线性和非线性引导等不同需求。
主线引导是线性引导,guideType为1,即引导是按顺序执行(上面例子通过数字递增来表示顺序,也可以配置关联上一个引导id来确定顺序),可以通过自动完成机制实现跳跃执行,但是不能反向执行。
系统引导是非线性引导,guideType为2,即引导是可以在满足引导触发条件时即可触发,无需按顺序执行,每个系统引导都是独立的。
第一部分:引导设计整体流程概述,参照图1所示为根据本发明较佳实施例的方法流程示意图,
引导流程:
游戏中实现一个GuideMgr的引导管理器。游戏启动后进入主界面,GuideMgr被实例化后开始做一些初始化流程,
具体流程详细阐述如下:
1)打开引导UI界面并隐藏缓存起来,等待后续需要引导的时候可以直接调用;
2)注册引导触发条件的监听事件,用于后续事件触发来检测引导触发条件是否满足;
3)从服务器获取当前用户的主线引导已完成的进度id(引导标识),进度id就是引导guideID。然后读表和检查自动完成引导条件completeCond列表来获取下一个需要执行的引导nextGuideID,如果不存在则主线引导已全部结束退出流程,跳到步骤7;
4)检查nextGuideID关联配置里的触发条件list列表里的条件是否满足,如果满足则根据guidePath加载行为树配置并执行,跳到步骤5;如果不满足则退出流程,跳到步骤6;
5)执行完当前引导的所有行为后,通知服务器nextGuideID为完成,客户端在收到服务器完成引导的返回协议后,把进度id改为nextGuideID,跳到步骤3继续下一个引导;
6)外部系统发送了引导触发条件监听的事件,这时候跳到步骤4;
7)主线引导全部结束,退出流程。
上面是主线引导的流程,引导管理器的主要功能就是推动引导执行的进程以及和服务器互通信存储相关的引导数据。系统引导和主线引导不仅类似而且更加简单些。系统引导没有主线引导流程3,主要流程就是监听事件来检测对应的系统引导是否满足触发条件,一旦可以触发则执行引导行为树部分,完毕后标记该系统引导结束,结束的系统引导后续将不会再触发。
精简的来说就是,
S1、读取当前已完成的引导,获取引导信息,其中引导信息包括引导标识、引导类型、完成信息以及配置表;
S2、读取配置表,获取下一个待执行引导的引导信息,若不存在则执行步骤S5;
S3、根据获取的下一个待执行引导的引导信息,读取配置表获取触发条件以及行为路径,判断当前是否满足触发条件,若是则根据行为路径加载行为树配置并执行,否则执行外部系统流程;
S4、行为树配置执行完毕后,将当前执行的引导的完成信息修改为已完成,并返回执行步骤S1;
S5、引导结束,退出流程。
对S1步骤,参照图3所示,读取已完成的引导信息,判断是否存在引导类型为主线引导的引导,若存在则执行下一步骤,否则读取引导类型为主线引导且引导顺序最靠前的引导,并获取引导信息;在已完成的引导中读取引导类型为主线引导且引导顺序最靠后的引导,并获取引导信息。
对于系统引导的流程,参照图2所示。
执行监听流程,并读取系统引导机制中的引导触发条件信息;
监听游戏运行过程中完成的事件,判断当前是否满足引导触发条件,若满足则读取对应的系统引导,获取引导信息,其中引导信息包括引导标识、引导类型、完成信息以及配置表,否则返回执行监听流程;
判断完成信息是否为未完成,若是则执行下一步骤,否则返回执行监听流程;
读取配置表获取触发条件以及行为路径,判断当前是否满足触发条件,若是则根据行为路径加载行为树配置并执行,否则返回执行监听流程;
行为树配置执行完毕后,将当前执行的引导的完成信息修改为已完成,并返回执行监听流程。
需要注意的是监听流程同时对主线引导也是时刻监听并起作用的,具体的流程为,
读取下一个待执行引导的引导信息;
读取配置表获取触发条件以及行为路径,判断当前是否满足触发条件,若是则根据行为路径加载行为树配置并执行,否则执行外部系统流程。
第二部分:引导具体实现模块概述
参照图4为对应的系统结构模块图,包括:
读取模块,用于读取引导信息并根据引导信息选择调用的模块;
节点模块,用于设置引导判断节点以及编辑引导信息;
事件执行模块,用于检测是否满足触发条件来加载行为树配置;
触发模块,用于检测是否满足引导触发条件来执行对应的引导。
主线引导判断模块,用于根据读取模块获取的信息判断是否还有未完成的主线引导。
包括监听模块,用于记录游戏运行中所有数据变化,包括但不限于发生的事件、角色等级变换以及UI界面的切换。
所述读取模块还包括引导信息分析模块,用于根据引导类型选择执行对应的模块,若引导类型为主线引导,则调用主线引导判断模块,若引导类型为系统引导,则调用触发模块。
下面主要是将引导分为节点实现模块、触发及执行模块两个部分来详细描述具体实现的功能。
节点实现模块
节点实现模块是触发及执行模块赖以实现的底层模块。
节点表每行配置关键字段有id(节点id),taskType(节点类型,行为节点为1,条件节点为2),name(节点名字,是编辑器里配置节点时显示的名字,也是节点实现的文件名,name是唯一),param(节点参数的类型列表),paramKey(节点参数的变量名列表)。
在节点表定义的节点可以在可视化行为树编辑器里编辑配置,同时程序需要在工程里写一份名字和节点名字一样的节点实现类。行为树在执行某个节点的时候,会把节点名字和节点参数列表传递给节点的代理层Proxy,代理层任务是根据节点名找到节点实现类并实例化创建一个对象,然后把节点参数列表传递给节点实现对象进行初始化流程。所有的节点实现类都有对应的基类实现。行为节点的基类是TaskBaseAction,条件节点的基类是TaskBaseCondition,它们又各自有统一的基类Task,基类的主要任务是把代理层传递下来节点参数列表序列化后交由子类去实现。每个节点实现子类需要实现具体对应的功能,比如CheckLevelCond类是用来作为条件节点判断玩家是否达到某个等级,需要在对应的onCheck函数来判断条件并放回接口。OpenGuideAreaAction类用来作为行为节点可以指定特定的游戏实例化对象并生成蒙版的效果,则需要在对应的onExecute执行对应的功能。执行一个条件节点时直接返回结果的,执行一个行为节点可能需要等待某个事件触发后才结束,所以行为节点还有一个endAction的接口需要主动调用来表示对该行为的结束,对应的等待实现就可以写在行为节点的实现类里,触发后再调用endAction来主动结束,这样可以很好地把功能封装到对应的节点实现类里。
一般比较大型的游戏需要的节点会非常得多,而且节点的底层功能可能在其他模块也需要使用,考虑到敏捷开发和代码通用性,于是把游戏中比较常用且功能需求大的用单独的节点实现类来写,而把其他小而通用的需求放到统一通用的节点实现类中。这里拿条件节点来举例(行为节点类似):条件通用节点放到CheckGeneralCond类来实现,该类在onCheck方法实现里仅仅只是调用一个通用的引导条件接口类GuideGeneralCond用来判断条件是否满足并返回,只需要传入统一约定好的参数即可。GuideGeneralCond主要是解析上层传递进来的条件参数,条件参数主要包括条件函数名,条件参数1,条件参数2等等,上层可以是行为树的条件节点,也可以是引导的触发条件模块,甚至可以是其他模块判断条件等。解析对应的条件函数名,获取当前类下同名的函数,并传递对应的条件参数执行获取返回结果是否成功给上层。后期如果要扩展一个条件,只需在GuideGeneralCond类中写对应的函数接口实现即可完成,配置和可视化界面等都不需要改动就能实现需求,大大地提高了扩展性。
引导触发及执行模块
引导触发模块主要是用来检测引导触发条件,如果满足触发条件则触发引导。所以需要先通过读取guide配置表里每个引导的list条件列表,缓存好触发条件和引导id的列表,后续通过触发的条件来获取感兴趣的引导id列表,如果有满足条件的引导id则可以直接触发对应的引导。引导触发条件通过事件来解耦,这样就不需要在其他模块插入触发引导监测的代码。唯一特殊的情况就是玩家登陆进主界面的时候需要主动监测一下主线引导的触发条件。
一般情况下引导的触发条件比如玩家达到某个等级,通关某个关卡,打开某个UI界面,这些条件和行为树里的条件节点判断的条件是可以通用的。所以这块底层也是调用GuideGeneralCond类来实现。
满足引导执行条件就需要根据guidePath加载行为树配置,序列化数据并执行行为树。行为树现技术理论已经发展成熟,可以自行研发或者使用第三方插件来编辑行为树。
行为树是由许多复合节点、条件节点和行为节点组成。行为树里还可以嵌套子树(SubTree),避免重复性的编辑行为树。
由于行为树里用来实现一大串的实现步骤。为了在行为树里也支持非线性触发特定步骤,可以在特定的行为之后打上行为标记(用行为节点实现),每个行为标记都有唯一的id,该标记客户端会和服务器会同步。如果某些行为不想重复触发,那么只需判断该对应的行为标记是否已经标记过,如果标记过就走另外一个分支流程即可,也可以拿该标记来做不一样的需求功能。
实现每一个具体功能都可以在行为树里通过添加新的行为和条件节点来实现,这样一来节点就是程序和策划沟通的主要关联内容,策划把需要实现的功能告诉程序,程序只需要编写对应功能的函数实现接口,然后策划就可以在行为树里直接配置该节点来实现需求,非常方便策划配置和修改,而扩展仅仅只需写更多的节点实现接口或节点实现类。
应当认识到,本发明的实施例可以由计算机硬件、硬件和软件的组合、或者通过存储在非暂时性计算机可读存储器中的计算机指令来实现或实施。所述方法可以使用标准编程技术-包括配置有计算机程序的非暂时性计算机可读存储介质在计算机程序中实现,其中如此配置的存储介质使得计算机以特定和预定义的方式操作——根据在具体实施例中描述的方法和附图。每个程序可以以高级过程或面向对象的编程语言来实现以与计算机系统通信。然而,若需要,该程序可以以汇编或机器语言实现。在任何情况下,该语言可以是编译或解释的语言。此外,为此目的该程序能够在编程的专用集成电路上运行。
此外,可按任何合适的顺序来执行本文描述的过程的操作,除非本文另外指示或以其他方式明显地与上下文矛盾。本文描述的过程(或变型和/或其组合)可在配置有可执行指令的一个或多个计算机系统的控制下执行,并且可作为共同地在一个或多个处理器上执行的代码(例如,可执行指令、一个或多个计算机程序或一个或多个应用)、由硬件或其组合来实现。所述计算机程序包括可由一个或多个处理器执行的多个指令。
进一步,所述方法可以在可操作地连接至合适的任何类型的计算平台中实现,包括但不限于个人电脑、迷你计算机、主框架、工作站、网络或分布式计算环境、单独的或集成的计算机平台、或者与带电粒子工具或其它成像装置通信等等。本发明的各方面可以以存储在非暂时性存储介质或设备上的机器可读代码来实现,无论是可移动的还是集成至计算平台,如硬盘、光学读取和/或写入存储介质、RAM、ROM等,使得其可由可编程计算机读取,当存储介质或设备由计算机读取时可用于配置和操作计算机以执行在此所描述的过程。此外,机器可读代码,或其部分可以通过有线或无线网络传输。当此类媒体包括结合微处理器或其他数据处理器实现上文所述步骤的指令或程序时,本文所述的发明包括这些和其他不同类型的非暂时性计算机可读存储介质。当根据本发明所述的方法和技术编程时,本发明还包括计算机本身。
计算机程序能够应用于输入数据以执行本文所述的功能,从而转换输入数据以生成存储至非易失性存储器的输出数据。输出信息还可以应用于一个或多个输出设备如显示器。在本发明优选的实施例中,转换的数据表示物理和有形的对象,包括显示器上产生的物理和有形对象的特定视觉描绘。
以上所述,只是本发明的较佳实施例而已,本发明并不局限于上述实施方式,只要其以相同的手段达到本发明的技术效果,都应属于本发明的保护范围。在本发明的保护范围内其技术方案和/或实施方式可以有各种不同的修改和变化。