- 浏览: 504874 次
- 性别:
- 来自: 广州
最新评论
-
cppmule:
Play!在国内实际产品级应用案例有吗?有哪些公司在用?国外的 ...
play总结性介绍 -
你好javaword:
netty的个人使用心得 -
hyfwuhui:
java 并发环境下使用ConcurrentHashMap -
asialee:
朋在无锡 写道可以将Channels使用静态导入的方式:imp ...
netty的个人使用心得 -
朋在无锡:
可以将Channels使用静态导入的方式:import sta ...
netty的个人使用心得
原创题目:使用行为树(Behavior Tree)实现游戏AI
原创作者: AKara
发布日期:2010-12-09
作者Bolg: http://blog.csdn.net/akara
原文出处: http://blog.csdn.net/akara/archive/2010/12/19/6084786.aspx
联系方式: akaras@163.com
---------------------------------------------------------------------
谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护
庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM),
决策树(Decision Tree)来实现游戏AI总有那么些不顺意。
试试Next-Gen AI的行为树(Behavior Tree)吧。
虽说Next-Gen AI,但距其原型提出已有约10年时间,而微软Halo系列估计
已用了超过8年了,Spore和一些著名游戏也早已使用行为树作为它们的AI结构。
如从未接触,那wikipedia(http://en.wikipedia.org/wiki/Behavior_Trees)
绝对是入门好资料。
---------------------------------------------------------------------
先贴本文最具价值图(配色可花了不少时间)
为显美观:BT被横放,Node层次被刻意减少,Dec被刻意安插,Cond被刻意捏造。
PS:其实真正的高效的Node Group剔除应多加一层Sequence Node。
---------------------------------------------------------------------
行为树(Behavior Tree)具有如下的特性:
它只有4大类型的Node:
* Composite Node
* Decorator Node
* Condition Node
* Action Node
任何Node被执行后,必须向其Parent Node报告执行结果:成功 / 失败。
这简单的成功 / 失败汇报原则被很巧妙地用于控制整棵树的决策方向。
---------------------------------------------------------------------
先看Composite Node,其实它按复合性质还可以细分为3种:
* Selector Node
当执行本类型Node时,它将从begin到end迭代执行自己的Child Node:
如遇到一个Child Node执行后返回True,那停止迭代,
本Node向自己的Parent Node也返回True;否则所有Child Node都返回False,
那本Node向自己的Parent Node返回False。
* Sequence Node
当执行本类型Node时,它将从begin到end迭代执行自己的Child Node:
如遇到一个Child Node执行后返回False,那停止迭代,
本Node向自己的Parent Node也返回False;否则所有Child Node都返回True,
那本Node向自己的Parent Node返回True。
* Parallel Node
并发执行它的所有Child Node。
而向Parent Node返回的值和Parallel Node所采取的具体策略相关:
Parallel Selector Node: 一False则返回False,全True才返回True。
Parallel Sequence Node: 一True则返回True,全False才返回False。
Parallel Hybird Node: 指定数量的Child Node返回True或False后才决定结果。
Parallel Node提供了并发,提高性能。
不需要像Selector/Sequence那样预判哪个Child Node应摆前,哪个应摆后,
常见情况是:
(1)用于并行多棵Action子树。
(2)在Parallel Node下挂一棵子树,并挂上多个Condition Node,
以提供实时性和性能。
Parallel Node增加性能和方便性的同时,也增加实现和维护复杂度。
PS:上面的Selector/Sequence准确来说是Liner Selector/Liner Sequence。
AI术语中称为strictly-order:按既定先后顺序迭代。
Selector和Sequence可以进一步提供非线性迭代的加权随机变种。
Weight Random Selector提供每次执行不同的First True Child Node的可能。
Weight Random Sequence则提供每次不同的迭代顺序。
AI术语中称为partial-order,能使AI避免总出现可预期的结果。
---------------------------------------------------------------------
再看Decorator Node,它的功能正如它的字面意思:它将它的Child Node执行
后返回的结果值做额外处理后,再返回给它的Parent Node。很有些AOP的味道。
比如Decorator Not/Decorator FailUtil/Decorator Counter/Decorator Time...
更geek的有Decorator Log/Decorator Ani/Decorator Nothing...
---------------------------------------------------------------------
然后是很直白的Condition Node,它仅当满足Condition时返回True。
---------------------------------------------------------------------
最后看Action Node,它完成具体的一次(或一个step)的行为,视需求返回值。
而当行为需要分step/Node间进行时,可引入Blackboard进行简单数据交互。
---------------------------------------------------------------------
整棵行为树中,只有Condition Node和Action Node才能成为Leaf Node,而也
只有Leaf Node才是需要特别定制的Node;Composite Node和Decorator Node均
用于控制行为树中的决策走向。(所以有些资料中也统称Condition Node和Action
Node为Behavior Node,而Composite Node和Decorator Node为Decider Node。)
更强大的是可以加入Stimulus和Impulse,通过Precondition来判断masks开关。
通过上述的各种Nodes几乎可以实现所有的决策控制:if, while, and, or,
not, counter, time, random, weight random, util...
---------------------------------------------------------------------
总的来说,行为树具有如下几种优点,确实是实现AI框架的利器,甚至是一种
通用的可维护的复杂流程管理利器:
> 静态性
越复杂的功能越需要简单的基础,否则最后连自己都玩不过来。
静态是使用行为树需要非常着重的一个要点:即使系统需要某些"动态"性。
其实诸如Stimulus这类动态安插的Node看似强大,
但却破坏了本来易于理解的静态性,弊大于利。
Halo3相对于Halo2对BT AI的一个改进就是去除Stimulus的动态性。
取而代之的做法是使用Behavior Masks,Encounter Attitude,Inhibitions。
原则就是保持全部Node静态,只是根据事件和环境来检查是否启用Node。
静态性直接带来的好处就是整棵树的规划无需再运行时动态调整,为很多优化
和预编辑都带来方便。
> 直观性
行为树可以方便地把复杂的AI知识条目组织得非常直观。
默认的Composite Node的从begin往end的Child Node迭代方式就像是处理一个
预设优先策略队列,也非常符合人类的正常思考模式:先最优再次优。
行为树编辑器对优秀的程序员来说也是唾手可得。
> 复用性
各种Node,包括Leaf Node,可复用性都极高。
实现NPC AI的个性区别甚至可以通过在一棵共用的行为树上不同的位置来
安插Impulse来达到目的。
当然,当NPC需要一个完全不同的大脑,比如70级大BOSS,
与其绞尽脑汁在一棵公用BT安插Impulse,不如重头设计一棵专属BT。
> 扩展性
虽然上述Node之间的组合和搭配使用几乎覆盖所有AI需求。
但也可以容易地为项目量身定做新的Composite Node或Decorator Node。
还可以积累一个项目相关的Node Lib,长远来说非常有价值。
---------------------------------------------------------------------
原创作者: AKara
发布日期:2010-12-09
作者Bolg: http://blog.csdn.net/akara
原文出处: http://blog.csdn.net/akara/archive/2010/12/19/6084786.aspx
联系方式: akaras@163.com
---------------------------------------------------------------------
谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护
庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM),
决策树(Decision Tree)来实现游戏AI总有那么些不顺意。
试试Next-Gen AI的行为树(Behavior Tree)吧。
虽说Next-Gen AI,但距其原型提出已有约10年时间,而微软Halo系列估计
已用了超过8年了,Spore和一些著名游戏也早已使用行为树作为它们的AI结构。
如从未接触,那wikipedia(http://en.wikipedia.org/wiki/Behavior_Trees)
绝对是入门好资料。
---------------------------------------------------------------------
先贴本文最具价值图(配色可花了不少时间)
为显美观:BT被横放,Node层次被刻意减少,Dec被刻意安插,Cond被刻意捏造。
PS:其实真正的高效的Node Group剔除应多加一层Sequence Node。
---------------------------------------------------------------------
行为树(Behavior Tree)具有如下的特性:
它只有4大类型的Node:
* Composite Node
* Decorator Node
* Condition Node
* Action Node
任何Node被执行后,必须向其Parent Node报告执行结果:成功 / 失败。
这简单的成功 / 失败汇报原则被很巧妙地用于控制整棵树的决策方向。
---------------------------------------------------------------------
先看Composite Node,其实它按复合性质还可以细分为3种:
* Selector Node
当执行本类型Node时,它将从begin到end迭代执行自己的Child Node:
如遇到一个Child Node执行后返回True,那停止迭代,
本Node向自己的Parent Node也返回True;否则所有Child Node都返回False,
那本Node向自己的Parent Node返回False。
* Sequence Node
当执行本类型Node时,它将从begin到end迭代执行自己的Child Node:
如遇到一个Child Node执行后返回False,那停止迭代,
本Node向自己的Parent Node也返回False;否则所有Child Node都返回True,
那本Node向自己的Parent Node返回True。
* Parallel Node
并发执行它的所有Child Node。
而向Parent Node返回的值和Parallel Node所采取的具体策略相关:
Parallel Selector Node: 一False则返回False,全True才返回True。
Parallel Sequence Node: 一True则返回True,全False才返回False。
Parallel Hybird Node: 指定数量的Child Node返回True或False后才决定结果。
Parallel Node提供了并发,提高性能。
不需要像Selector/Sequence那样预判哪个Child Node应摆前,哪个应摆后,
常见情况是:
(1)用于并行多棵Action子树。
(2)在Parallel Node下挂一棵子树,并挂上多个Condition Node,
以提供实时性和性能。
Parallel Node增加性能和方便性的同时,也增加实现和维护复杂度。
PS:上面的Selector/Sequence准确来说是Liner Selector/Liner Sequence。
AI术语中称为strictly-order:按既定先后顺序迭代。
Selector和Sequence可以进一步提供非线性迭代的加权随机变种。
Weight Random Selector提供每次执行不同的First True Child Node的可能。
Weight Random Sequence则提供每次不同的迭代顺序。
AI术语中称为partial-order,能使AI避免总出现可预期的结果。
---------------------------------------------------------------------
再看Decorator Node,它的功能正如它的字面意思:它将它的Child Node执行
后返回的结果值做额外处理后,再返回给它的Parent Node。很有些AOP的味道。
比如Decorator Not/Decorator FailUtil/Decorator Counter/Decorator Time...
更geek的有Decorator Log/Decorator Ani/Decorator Nothing...
---------------------------------------------------------------------
然后是很直白的Condition Node,它仅当满足Condition时返回True。
---------------------------------------------------------------------
最后看Action Node,它完成具体的一次(或一个step)的行为,视需求返回值。
而当行为需要分step/Node间进行时,可引入Blackboard进行简单数据交互。
---------------------------------------------------------------------
整棵行为树中,只有Condition Node和Action Node才能成为Leaf Node,而也
只有Leaf Node才是需要特别定制的Node;Composite Node和Decorator Node均
用于控制行为树中的决策走向。(所以有些资料中也统称Condition Node和Action
Node为Behavior Node,而Composite Node和Decorator Node为Decider Node。)
更强大的是可以加入Stimulus和Impulse,通过Precondition来判断masks开关。
通过上述的各种Nodes几乎可以实现所有的决策控制:if, while, and, or,
not, counter, time, random, weight random, util...
---------------------------------------------------------------------
总的来说,行为树具有如下几种优点,确实是实现AI框架的利器,甚至是一种
通用的可维护的复杂流程管理利器:
> 静态性
越复杂的功能越需要简单的基础,否则最后连自己都玩不过来。
静态是使用行为树需要非常着重的一个要点:即使系统需要某些"动态"性。
其实诸如Stimulus这类动态安插的Node看似强大,
但却破坏了本来易于理解的静态性,弊大于利。
Halo3相对于Halo2对BT AI的一个改进就是去除Stimulus的动态性。
取而代之的做法是使用Behavior Masks,Encounter Attitude,Inhibitions。
原则就是保持全部Node静态,只是根据事件和环境来检查是否启用Node。
静态性直接带来的好处就是整棵树的规划无需再运行时动态调整,为很多优化
和预编辑都带来方便。
> 直观性
行为树可以方便地把复杂的AI知识条目组织得非常直观。
默认的Composite Node的从begin往end的Child Node迭代方式就像是处理一个
预设优先策略队列,也非常符合人类的正常思考模式:先最优再次优。
行为树编辑器对优秀的程序员来说也是唾手可得。
> 复用性
各种Node,包括Leaf Node,可复用性都极高。
实现NPC AI的个性区别甚至可以通过在一棵共用的行为树上不同的位置来
安插Impulse来达到目的。
当然,当NPC需要一个完全不同的大脑,比如70级大BOSS,
与其绞尽脑汁在一棵公用BT安插Impulse,不如重头设计一棵专属BT。
> 扩展性
虽然上述Node之间的组合和搭配使用几乎覆盖所有AI需求。
但也可以容易地为项目量身定做新的Composite Node或Decorator Node。
还可以积累一个项目相关的Node Lib,长远来说非常有价值。
---------------------------------------------------------------------
发表评论
-
netty4更新详解
2015-11-14 10:52 641netty现在应该是java界最流行的网络框架之一了,高性能, ... -
Lua使用protocolbuf
2015-11-10 16:04 869在https://code.google.com/p/prot ... -
领域模型设计
2015-09-12 17:29 692一:面向对象设计中最简单的部分与最难的部分 如果说事务脚本是 ... -
关于分表与分库思路
2015-07-06 15:36 628首先主要实现应该参考开源产品,目前比较能上台面的是 tddl, ... -
NAT穿透解决方案介绍
2015-04-01 03:12 2008最近公司要实现在各种网络环境下面的多屏互动(机顶盒、andro ... -
音视频即时通讯开发中使用P2P技术的好处
2015-04-01 02:59 745在服务器的配置文件“A ... -
nat穿透原理
2015-04-01 02:01 1055一直以来,说起NAT穿透,很多人都会被告知使用UDP打孔这个技 ... -
Erlang学习记录(二)——基本数据类型
2015-03-30 03:51 474Erlang学习记录(二)—— ... -
集群、分布式、负载均衡区别与联系
2015-03-25 22:54 5941、Linux集群主要分成三 ... -
: 结构化数据的共享存储
2015-03-24 04:25 0开发笔记 (6) : 结构化数据的共享存储 开始这个话题前, ... -
:如何构建超强伸缩性的游戏服务器而集容错、负载均衡和无限伸缩性于一身
2015-03-24 04:04 913附标题:如何构建超强 ... -
edis在游戏服务器中的应用
2015-03-24 02:57 625edis在游戏服务器中的应 ... -
社交游戏之双机热备方案 预防单点故障
2015-03-23 04:46 882某一天深夜,单盘配置的服务器出现硬盘损坏,导致该服务器上所提 ... -
游戏服务器集群设计思路
2015-03-23 04:45 797对于我们的游戏服务器端来说,除了要满足一般的MMO服务 ... -
Erlang类型及函数声明规格
2015-03-04 14:33 663Erlang类型及函数声明规格 Author: Mail: ... -
(转)erlang lists模块函数使用大全
2015-02-12 16:26 629一,带函数Pred 1, all(Pred ... -
超越并行框架erlang之流的通讯框架
2015-02-05 17:41 653http://blog.codingnow.com/2011/ ... -
如何使用 Oracle Linux 中的硬件故障管理
2014-11-10 14:38 1474如何使用 Oracle Linux 中 ... -
配置nginx
2014-06-14 18:04 614http://www.cnblogs.com/wenanry/ ... -
centos 安装mysql
2014-06-13 12:23 600你是root權限嗎?_操作系統的_ 兩種方法 1 使用替換法 ...
相关推荐
行为树(Behavior Tree,简称BT)是一种在游戏开发、机器人学以及人工智能领域广泛应用的设计模式,用于管理复杂的决策逻辑。其核心在于将复杂的任务分解成一系列更小、更易管理的子任务,通过树状结构来表示这些...
行为树(Behavior Tree)是一种在游戏AI和机器人控制领域广泛使用的结构化设计工具,它能够清晰地描述和组织复杂的逻辑流程。行为树以其模块化、易于理解和扩展的特性,成为了现代游戏开发中智能体行为控制的重要...
在Unreal Engine 4(UE4)中,游戏AI的行为控制是通过先进的工具和技术实现的,其中BehaviorTree(行为树)是一种重要的机制。行为树允许开发者以可视化的方式设计AI的逻辑,使得非程序员也能理解并调整AI的行为。在...
BehaviorTree是Unity3D中用于AI行为设计的一种工具,尤其适用于非玩家角色(NPC)的行为逻辑控制。本项目"Unity3D 编辑器行为树节点样例_BehaviorTree"提供了一个行为树编辑器的示例,旨在帮助开发者自定义和扩展以...
BehaviorTree.js 行为树JavaScript实现。 它们对于实现AI很有用。 如果您需要有关行为树的更多信息,请查看 , 不错的。 产品特点 需要的:序列,选择器,任务 扩展:装饰器 安装 如果使用npm: npm install ...
行为树(Behavior Tree)是一种在游戏AI和机器人领域广泛应用的控制结构,用于描述复杂的行为逻辑。Behavior Designer 是一个针对Unity引擎的高级行为树插件,它简化了在Unity项目中实现智能行为的设计过程。该插件...
行为树(Behavior Tree)是一种在游戏AI和机器人控制领域广泛应用的结构,用于组织和表达复杂的逻辑。本项目提供了一个基于C++11实现的简单行为树框架,它兼容Visual Studio 2015、g++4.8和clang++3.4等编译器。下面...
行为树(BehaviorTree)是一种在游戏AI设计中广泛使用的架构,尤其在Unity3D引擎中,它被用来创建复杂、灵活的角色行为模式。行为树通过一种直观的方式将一系列任务和决策组织起来,允许开发者设计出有智能的行为...
行为树(Behavior Tree)是一种在人工智能(AI)领域中用于设计和实现复杂行为的结构化方法,尤其在游戏开发和机器人控制中应用广泛。它通过树状结构来组织AI的行为,使得逻辑清晰、易于理解和调试。这篇博文《用...
Behavior-Tree, 在 C 中,行为树库 新闻 !我们的书名为"机器人和人工智能中的行为树"的书在这里可以供查阅: https://arxiv.org/abs/1709.00084 BT C 中的行为树库。我正在使用 Davide Facont
使用Behavior Designer可以极大地提高游戏AI的开发效率,无论是简单的寻路行为还是复杂的决策逻辑,都能通过行为树进行高效设计。对于初学者,Behavior Designer的易用性使其成为学习行为树概念的理想工具;对于经验...
在Cocos2d-x游戏引擎中,cocos_behavior_tree库提供了一个用TypeScript实现的行为树框架,方便开发者创建智能行为。 行为树由一系列节点构成,这些节点可以是叶子节点(执行特定任务)或复合节点(组织其他节点)。...
在IT行业中,前端开发是构建Web应用程序的重要组成部分,而行为树(Behavior Tree)是一种在人工智能(AI)领域中广泛使用的工具,特别是在游戏开发和复杂的交互系统设计中。在这个"前端项目-behaviortree.zip"中,...
与其他实现相比,很少有功能可以使BehaviorTree.CPP变得唯一: 它使异步Action (即非阻塞)成为一等公民。 您可以构建可同时执行多个操作的React式行为。 树是使用域特定脚本脚本语言(基于XML)定义的,并且可以...
Behavior Designer是一款专为Unity引擎设计的行为树(Behavior Tree)插件,版本1.6提供了更加易用和功能强大的工具,让游戏AI的设计变得更加直观和高效。行为树是一种强大的设计工具,广泛应用于游戏AI中,用于模拟...
在游戏开发领域,特别是AI设计中,行为树(Behavior Tree)是一种强大的工具,它允许开发者以直观和灵活的方式定义游戏角色的行为逻辑。BehaviorDesigner 1.5.7就是针对Unity引擎的一款高效行为树插件,为开发者提供...
Unity3D 中的行为树插件是游戏开发领域中一种强大的工具,它允许开发者以图形化的方式设计和实现人工智能(AI)行为。行为树是AI设计中的一个重要概念,它通过节点和连接线的形式来描述复杂的逻辑流程,使得非程序员...
行为设计(Behavior Designer)是Unity引擎中一个强大的行为树(Behavior Tree)编辑工具,它专为游戏AI(人工智能)和复杂系统设计。行为树是一种表示有限决策过程的图形结构,常用于游戏AI、机器人控制以及任务...
行为树(Behavior Tree, BT)是一种在人工智能(AI)设计中用于构建和组织非玩家角色(NPC)行为的工具,尤其在游戏开发领域中广泛应用。Unity5.2版本中的Behavior Trees算法提供了高效且灵活的方式来定义复杂的NPC...
行为树(Behavior Tree)是一种在游戏AI中广泛使用的表示复杂逻辑和决策流程的工具。它在游戏设计中扮演着重要角色,特别是在角色的行为控制、任务规划以及非玩家角色(NPCs)的智能行为设计上。行为树通过清晰的...