Go游戏服务器开发的一些思考(十二):行为树behavior3go介绍

原创 2017年08月12日 21:35:48

概要

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

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

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

图1

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

    ...

    root IBaseNode

    ...
}

// BehaviorTree::Load 构建行为树
func (this *BehaviorTree) Load(data *config.BTTreeCfg, maps *b3.RegisterStructMaps, extMaps *b3.RegisterStructMaps) {

    ...

    // Create the node list (without connection between them)
    ...

    // Connect the nodes
    ...

    this.root = nodes[data.Root]
}

// BehaviorTree::Tick 执行一次行为树
func (this *BehaviorTree) Tick(target interface{}, blackboard *Blackboard) b3.Status {

    ...

    /* TICK NODE */
    var state = this.root._execute(tick)

    ...

    return state
}
  • BevTreeConfig
    配置类,读取json文件

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

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

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

    const (
    SUCCESS Status = 1
    FAILURE Status = 2
    RUNNING Status = 3
    ERROR Status = 4
    )

    RUNNING状态该节点 本次执行尚未完成行为
    其余返回值均代表该节点行为执行完毕
    自定义的Composite,可以根据子节点返回的状态指,做特殊的分支流向

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

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

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

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

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

实例分析

如下图,一颗行为树:
图2

执行结果为:

log
log
wait 3000ms
log

技能与行为树

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

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

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

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

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

行为树如下:

图3

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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013272009/article/details/77131226

AI-行为树

-
  • 1970年01月01日 08:00

安卓behavior详解3--自定义behavior详解

一.前言官方定义: A Behavior implements one or more interactions that a user can take on a child view. Thes...
  • jin870132
  • jin870132
  • 2017-09-17 20:13:00
  • 386

behavior3editor环境搭建

1.下载nodejs,解压后进入目录:    cp -r bin/* /usr/local/bin/    cp -r include/* /usr/local/include/    cp -r s...
  • Allen_sina
  • Allen_sina
  • 2018-03-09 18:17:31
  • 54

【 D3.js 进阶系列 — 6.0 】 拖拽的应用(Drag)

拖拽(Drag)是交互式中很重要的一种,本文将讲解拖拽的使用方法。
  • lzhlzz
  • lzhlzz
  • 2014-12-27 22:39:18
  • 9207

使用行为树(Behavior Tree)实现游戏AI

注意:本文版权归Csdn AKara所有,此处纯粹转载,如有再转,请严格按如下方式显示标明原创作者及出处,以示尊重!! 原创题目:使用行为树(Behavior Tree)实现游戏AI原创作者: AKa...
  • kenkao
  • kenkao
  • 2010-12-27 10:01:00
  • 51852

go版本行为树

概念行为树一般在做游戏AI的时候经常用到,Unity3d就有一款专门的行为树插件,Unreal4里面也在引擎层支持行为树编辑。本人之前是做Unity3d手游的,对这些有所涉猎,最近在用go语言写后台,...
  • u010217427
  • u010217427
  • 2017-11-30 16:43:54
  • 115

二、行为树的原理和实现

使用BTEditor可以生成行为树的Lua代码,这里对生成的代码进行解析。 (BTEditor的项目主页:https://github.com/bartoleo/BTEditor) 要注意: 1...
  • iamagoodguy254
  • iamagoodguy254
  • 2014-10-03 18:18:59
  • 3633

行为树-学习笔记(1)

概念介绍行为树,有分支节点,叶节点,是根据分支的条件最后决定是否执行叶节点的逻辑结构。简而言之,行为树原理就是从树根开始,经过分支节点的逻辑判断,最后选择出叶节点执行。 行为树一般有4种节点: 顺...
  • weixiao2015
  • weixiao2015
  • 2016-01-05 11:49:04
  • 1063

使用Golang开发手游服务器的感想

从最初决定使用Golang开发游戏服务器(参考这里),到服务器基本成型,经过了两个多礼拜的时间。这里记录一下感想和心得。具体Golang的使用经验将来有时间会再开篇文章来写。         两个礼...
  • langresser
  • langresser
  • 2016-01-11 11:30:00
  • 9456

go实现一个简单的游戏服务器框架(lotou)起源

最近一直想学习一些关于游戏服务器的知识,显示看了一下云风的skynet框架,从而对于一个游戏服务器框架有了一个基本概要了解。先来说说我对于skynet的一些理解吧。skynet理解skynet只完成了...
  • sydnash
  • sydnash
  • 2016-12-08 15:30:30
  • 3221
收藏助手
不良信息举报
您举报文章:Go游戏服务器开发的一些思考(十二):行为树behavior3go介绍
举报原因:
原因补充:

(最多只允许输入30个字)