行为树behavior3go介绍

简介:

概要

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

本文介绍一个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语言及行为树教材。

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

71d401e57cdfd1a79c69901917ff04bff34026df

  • 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}
d47e62d2b349aca45e42305ed6714efbe5ed61d9BevTreeConfig 
d47e62d2b349aca45e42305ed6714efbe5ed61d9配置类,读取json文件
d47e62d2b349aca45e42305ed6714efbe5ed61d9Blackboard 一颗行为树共享数据的地方
d47e62d2b349aca45e42305ed6714efbe5ed61d9Tick 通过该类对象可以获取 BehaviorTree、Blackboard等对象引用
d47e62d2b349aca45e42305ed6714efbe5ed61d9BaseNode、BaseNodeWorker 
d47e62d2b349aca45e42305ed6714efbe5ed61d9行为树节点基类 
d47e62d2b349aca45e42305ed6714efbe5ed61d9每个节点执行tick()时,会返回一个状态值 
d47e62d2b349aca45e42305ed6714efbe5ed61d9行为树的原理,就是利用树分叉、每个节点执行后返回的状态值的不同,从而产生不同的行为分支 
d47e62d2b349aca45e42305ed6714efbe5ed61d9总共有4种状态,如下定义

1const (
2SUCCESS Status = 1
3FAILURE Status = 2
4RUNNING Status = 3
5ERROR Status = 4
6)
 
d47e62d2b349aca45e42305ed6714efbe5ed61d9 RUNNING状态该节点 本次执行尚未完成行为 
d47e62d2b349aca45e42305ed6714efbe5ed61d9 其余返回值均代表该节点行为执行完毕 
d47e62d2b349aca45e42305ed6714efbe5ed61d9 自定义的Composite,可以根据子节点返回的状态指,做特殊的分支流向
d47e62d2b349aca45e42305ed6714efbe5ed61d9 Composite 
d47e62d2b349aca45e42305ed6714efbe5ed61d9通过继承它,来组织一组行为,确定分支走向
d47e62d2b349aca45e42305ed6714efbe5ed61d9Action 
d47e62d2b349aca45e42305ed6714efbe5ed61d9通过继承它,来定义一个具体的行为
d47e62d2b349aca45e42305ed6714efbe5ed61d9Decorator 
d47e62d2b349aca45e42305ed6714efbe5ed61d9通过继承它,来定义一个作用于行为的约束
d47e62d2b349aca45e42305ed6714efbe5ed61d9Condition 
d47e62d2b349aca45e42305ed6714efbe5ed61d9通过继承它,来定义一个返回成功或失败的条件
d47e62d2b349aca45e42305ed6714efbe5ed61d9其他 

d47e62d2b349aca45e42305ed6714efbe5ed61d9behavior3提供了一系列基本的Composite、Action、Decorator实现

实例分析

如下图,一颗行为树: 

4a76e8748c595428fce2ed7e8f7004a8b50b0238

执行结果为:


1log
2log
3wait 3000ms
4log
技能与行为树

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

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

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

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

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

行为树如下:

e3e89ea04d51360ef4c430a412fc25bd45a1340c

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



原文发布时间为:2018-06-23
本文来自云栖社区合作伙伴“ Golang语言社区”,了解相关信息可以关注“ Golang语言社区”。
相关文章
|
5月前
|
Go
go 判断两棵树内容是否一致
go 判断两棵树内容是否一致
20 0
|
12月前
|
XML 数据可视化 Go
go语言|数据结构:二叉树可视化(svg树形图改进版)
go语言|数据结构:二叉树可视化(svg树形图改进版)
447 0
|
12月前
|
XML 编解码 算法
go语言|数据结构:二叉树可视化(制作svg格式树形图)
go语言|数据结构:二叉树可视化(制作svg格式树形图)
11158 2
|
12月前
|
自然语言处理 Go
Go语言学习编程实践:实现简易计算器(包含词法器、语法树构建)
Go语言学习编程实践:实现简易计算器(包含词法器、语法树构建)
113 0
每日一题 --- 590. N 叉树的后序遍历[力扣][Go]
每日一题 --- 590. N 叉树的后序遍历[力扣][Go]
每日一题 --- 590. N 叉树的后序遍历[力扣][Go]
每日一题 --- 589. N 叉树的前序遍历[力扣][Go]
每日一题 --- 589. N 叉树的前序遍历[力扣][Go]
每日一题 --- 589. N 叉树的前序遍历[力扣][Go]
|
4天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
29 0
|
1天前
|
JavaScript 前端开发 Go
Go语言的入门学习
【4月更文挑战第7天】Go语言,通常称为Golang,是由Google设计并开发的一种编程语言,它于2009年公开发布。Go的设计团队主要包括Robert Griesemer、Rob Pike和Ken Thompson,这三位都是计算机科学和软件工程领域的杰出人物。
8 1
|
1天前
|
Go
|
2天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
130 1