195

行为树behavior3go介绍

 5 years ago
source link: http://www.10tiao.com/html/415/201806/2649839105/1.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

社区零食大礼包限量发售:

(豆干牛肉丝创意福袋等四川特产)


概要

在游戏开发中,以状态切换来驱动其执行流程的系统,引入行为树可以大大简化编码和配置。

本文介绍一个golang行为树库 - behavior3go,并举例如何使用behavior3go来制作技能。

behavior3go介绍

behavior3go 是 behavior3系列 的go语言版本。

最初是behavior3js,是为java做的一个行为树库。

目前支持的语言有:

  • behavior3js (java,官方维护)

  • behavior3py (python,官方维护)

  • behavior3go (go)

  • behavior3cpp (c++)

  • behavior3-lua (lua)

以上均可以在github上找到。

behavior3go github网址为:https://github.com/magicsea/behavior3go

behavior3editor介绍

behavior3editor是官方提供的编辑器,一个web应用。

github网址为:https://github.com/behavior3/behavior3editor

如果不想在本地搭behavior3editor,可以使用官方提供的在线编辑器,网址为:http://editor.behavior3.com

behavior3go源代码分析

behavior3go代码量非常少,且设计优良。

展示了go语言版类继承、多态的实现方法;go语言反射机制的应用

是非常好的golang语言及行为树教材。

废话不再多说,直接上图:

  • BehaviorTree 
    代表一棵行为树,以下是摘录主要的代码:

 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}
  • BevTreeConfig 
    配置类,读取json文件

  • Blackboard 
    一颗行为树共享数据的地方

  • Tick 
    通过该类对象可以获取 BehaviorTree、Blackboard等对象引用

  • BaseNode、BaseNodeWorker 
    行为树节点基类 
    每个节点执行tick()时,会返回一个状态值 
    行为树的原理,就是利用树分叉、每个节点执行后返回的状态值的不同,从而产生不同的行为分支 
    总共有4种状态,如下定义

1const ( 
2SUCCESS Status = 1 
3FAILURE Status = 2 
4RUNNING Status = 3 
5ERROR Status = 4 
6)
  • RUNNING状态该节点 本次执行尚未完成行为 
    其余返回值均代表该节点行为执行完毕 
    自定义的Composite,可以根据子节点返回的状态指,做特殊的分支流向

  • Composite 
    通过继承它,来组织一组行为,确定分支走向

  • Action 
    通过继承它,来定义一个具体的行为

  • Decorator 
    通过继承它,来定义一个作用于行为的约束

  • Condition 
    通过继承它,来定义一个返回成功或失败的条件

  • 其他 
    behavior3提供了一系列基本的Composite、Action、Decorator实现

实例分析

如下图,一颗行为树: 

执行结果为:

1log 
2log 
3wait 3000ms 
4log

技能与行为树

技能根据其复杂程度,可以分为无状态技能和有状态技能

比如对一些游戏类型进行考察:

游戏类型 技能情况 MMO游戏 瞬发、AOI范围、无状态 MOBA游戏 持续、多段伤害、位移、有状态 IO游戏 看玩法。MMO型技能;MOBA型技能 皆有

显然如果做MOBA型技能时,引入行为树,则可以定义实现一些基础攻击行为。然后就可以通过配置,组合出各种形式的技能。

使用behavior3go,制作3段式攻击技能

行为树如下:

(后注1:上图三段式攻击还不是很严谨,2、3分支,需要在action节点前增加一个condition节点来判断是否玩家在指定的时间间隔内请求普通攻击。) 
(后注2:上图三段式攻击,MyMax Decorator节点表述也可能会造成误解。另外三段式攻击行为树其实 Decorator节点可以不用)




About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK