起因

我使用行为树管理技能的释放前逻辑的思路来源于肛少的技能系统:

基于行为树的MOBA技能系统:技能系统与可视化节点技能编辑器

当我感受到行为树强大的自定义分支判断能力和技能系统天生的切合,我就决定

行为树,就你了!

说明

技能释前逻辑管理的方案很多

行为树只是其中一种

另外我认为行为树管理释前逻辑可能不太适合小项目

因为维护与制作行为树节点需要不少的工作量

而小项目对特殊定制节点的复用又可能非常有限

这样的情况下硬编码的方案反而是更加轻松可控的选择

基础概念以及选型的方向

基本用法

首先我们来看一个最简单的技能行为树(在MDDSkillEngine提供的行为树编辑界面中子节点的执行顺序为从下往上)

简易演示行为树

这颗树的基本逻辑是

卡尔天火技能被激活以后

会不停的轮询判断,玩家是否做出了释放天火的指令输入行为

如果输入了释放天火指令,则执行释放天火节点之后重置输入

这就是行为树在技能系统中最基本的用法

我们都知道卡尔装备了A杖以后可以释放毁天灭地

那么我们可以对天火技能树做一个快速的拓展

简易演示行为树

这样我们就轻松愉快的通过行为树表达了Dota2中卡尔的天火技能的释放逻辑。

黑板

黑板就是行为树的数据库(也可以作为任何实体的临时数据库,在MDDSkillEngine中会广泛用到)

例如天火技能行为树的,cd时间变量,输入变量,都可以存在对应的黑板中

技能行为树中的黑板结构

为了能更好管理技能数据

我会为一个技能行为树创建两个黑板

其中一个是同一个角色下所有技能共有的公共的角色级黑板

另一个则是技能本身的私有黑板

黑板示例图

从示例图中可以看出

对于卡尔来说

技能本身的cd,是否输入,可以存在技能级的私有黑板中

而公共cd(举例),冰火雷buff数量,则可以存在角色级公共黑板中

这样我们更改公共cd可以通过具体算法影响卡尔所有技能的cd,卡尔的祈唤技能也可以获取到卡尔身上的buff数据

黑板关系示意图

这样我们就通过黑板建立起了一个舒适的技能数据编辑结构。

在技能系统中使用行为树的两个方向

1.全都干

由于行为树出色的自定义属性

我们完全可以将行为树作为技能系统的核心逻辑驱动方式

这样我们可以做到将整个技能的制作都变成可视化可编辑的行为树

其编辑的粒度大小取决于所制作的单个行为树节点的运行逻辑粒度

例子如下:

演示用简易行为树

可以看到示例图中的行为树已经包含了具体的技能释放后逻辑,播放音效,添加buff等。

行为树的叶子节点也完全可以作为一个子树的开启节点。

进行行为树与行为树之间的无限嵌套。

这样的一棵树,完全有能力表达一个完整的技能。

2.取其精华

行为树的本质就是轮询式的逻辑分支判断并在条件达成时执行对应的叶子行为,就像基础用法中展示的那般。

所以我们完全可以只将行为树作为一个技能释放前的发起器,用来管理一个技能的释放前逻辑。

技能的释放通过一个叶子节点抛出,抛出后的技能逻辑执行另行管理。

演示用简易行为树

就像示例图这样通过一个ReleaseSkill节点将技能释放后逻辑抛出。

MDDSkillEngine选择的就是此方向。

这样做的理由是,行为树的逻辑编辑是直观的但是具体游戏表现编辑是抽象的。

所以为了强化技能系统对于技能效果具体表现的掌控力,MDDSkillEngine决定将技能的释放后逻辑执行从行为树抛出,技能释放后的逻辑通过FSM驱动,并引入了Slate(timeline)编辑表现,具体实现在之后的文章中都会一一叙述。

技术选型

行为树runtime使用NPBehave:https://github.com/meniku/NPBehave

NPBehave基础架构:架构图

可视化编辑支持插件:XNode

可视化细节:NPBehave可视化与优化


记录历程,整理思路,共享知识,分享思维。