在游戏开发中,以状态切换来驱动其执行流程的系统,引入行为树可以大大简化编码和配置。
本文介绍一个golang行为树库 - behavior3go,并举例如何使用behavior3go来制作技能。
behavior3go 是 behavior3系列 的go语言版本。
最初是behavior3js,是为java做的一个行为树库。
目前支持的语言有:
以上均可以在github上找到。
behavior3go github网址为:https://github.com/magicsea/behavior3go
behavior3editor是官方提供的编辑器,一个web应用。
github网址为:https://github.com/behavior3/behavior3editor
如果不想在本地搭behavior3editor,可以使用官方提供的在线编辑器,网址为:http://editor.behavior3.com
behavior3go代码量非常少,且设计优良。
展示了go语言版类继承、多态的实现方法;go语言反射机制的应用
是非常好的golang语言及行为树教材。
废话不再多说,直接上图:
1type BehaviorTree struct {
2
3 ...
4
5 root IBaseNode
6
7 ...
8}
9
10// BehaviorTree::Load 构建行为树
11func (this *BehaviorTree) Load(data *config.BTTreeCfg, maps *b3.RegisterStructMaps, extMaps *b3.RegisterStructMaps) {
12
13 ...
14
15 // Create the node list (without connection between them)
16 ...
17
18 // Connect the nodes
19 ...
20
21 this.root = nodes[data.Root]
22}
23
24// BehaviorTree::Tick 执行一次行为树
25func (this *BehaviorTree) Tick(target interface{}, blackboard *Blackboard) b3.Status {
26
27 ...
28
29 /* TICK NODE */
30 var state = this.root._execute(tick)
31
32 ...
33
34 return state
35}
1const (
2SUCCESS Status = 1
3FAILURE Status = 2
4RUNNING Status = 3
5ERROR Status = 4
6)
如下图,一颗行为树:
执行结果为:
1log
2log
3wait 3000ms
4log
技能根据其复杂程度,可以分为无状态技能和有状态技能
比如对一些游戏类型进行考察:
游戏类型 | 技能情况 |
---|---|
MMO游戏 | 瞬发、AOI范围、无状态 |
MOBA游戏 | 持续、多段伤害、位移、有状态 |
IO游戏 | 看玩法。MMO型技能;MOBA型技能 皆有 |
显然如果做MOBA型技能时,引入行为树,则可以定义实现一些基础攻击行为。然后就可以通过配置,组合出各种形式的技能。
行为树如下:
(后注1:上图三段式攻击还不是很严谨,2、3分支,需要在action节点前增加一个condition节点来判断是否玩家在指定的时间间隔内请求普通攻击。) (后注2:上图三段式攻击,MyMax Decorator节点表述也可能会造成误解。另外三段式攻击行为树其实 Decorator节点可以不用)