行为树

行为树(Behavior Tree),有4大类型的Node:

(1) Composites Node  组合节点,包括经典的:Sequence,Selector,Parallel

 * 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: 有一个子节点True返回True,否则返回False。
Parallel Sequence Node: 有一个子节点False返回False,否则返回True。
Parallel Fall On All Node: 所有子节点False才返回False,否则返回True。
Parallel Succeed On All Node: 所有子节点True才返回True,否则返回False。
Parallel Hybird 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避免总出现可预期的结果。

(2) Decorator Node 装饰节点,顾名思义,就是为仅有的一个子节点额外添加一些功能,比如让子task一直运行直到其返回某个运行状态值,或者将task的返回值取反等等

(3) Actions Node     行为节点,行为节点是真正做事的节点,其为叶节点。Behavior Designer插件中自带了不少Action节点,如果不够用,也可以编写自己的Action。一般来说都要编写自己的Action,除非用户是一个不懂脚本的美术或者策划,只想简单地控制一些物件的属性。

(4) Conditinals Node 条件节点 ,用于判断某条件是否成立。目前看来,是Behavior Designer为了贯彻职责单一的原则,将判断专门作为一个节点独立处理,比如判断某目标是否在视野内,其实在攻击的Action里面也可以写,但是这样Action就不单一了,不利于视野判断处理的复用。一般条件节点出现在Sequence控制节点中,其后紧跟条件成立后的Action节点。

 

  整棵行为树中,只有Condition Node和Action Node才能成为Leaf Node,而也只有Leaf Node才是需要特别定制的Node;Composite Node和Decorator Node均用于控制行为树中的决策走向。(所以有些资料中也统称Condition Node和ActionNode为Behavior Node,而Composite Node和Decorator Node为Decider Node。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SCRUM 12.03

第二轮迭代从今天起正式开始了。12月3日,我们举行了一次组会。 第一轮迭代结束时,我们意识到第二轮迭代需要实现的功能主要如下: 在下次迭代的时候实现对多个网站的信息进行比较取最优惠的选择,目前我们劲针对了一个网站的信息进行…

阻止页面双击选中文本

轮播图实现中&#xff0c;发现当点击切换按钮时&#xff0c;如果用户点快乐&#xff0c;双击了按钮&#xff0c;就会选中文本。十分影响浏览效果&#xff0c;所以有了这篇文章。 IE以及谷歌下的解决办法&#xff1a; <div id"zell-carousel" class"zell-caro…

STL内嵌数据类型: value_type

使用stl库的时候一直对value_type这个东西理解的不是很好&#xff0c;可以说就是不理解。今天看了《STL源码剖析》才恍然大悟。这里稍作记录。 每个STL中的类都有value_type这种东西&#xff0c;通俗的说value_type 就是stl容器盛装的数据的数据类型&#xff0c;例如&#xff…

Boost.Python实现Python C/C++混合编程

导出函数 #include<string> #include<boost/python.hpp>using namespace std; using namespace boost::python;char const * greet() {return "hello,world";}BOOST_PYTHON_MODULE(hello_ext) {def("greet", greet); } import hello_ext pri…

swift UIActivityIndicatorView

// // ActivityIndicatorViewController.swift // UIControlDemo // // Created by on 14/12/1. // Copyright (c) 2014年 马大哈. All rights reserved. // import UIKit class ActivityIndicatorViewController: BaseViewController { var waitActivity:UIActivityIndi…

UE4打包后如何调试

在项目打包后发现有一个数组越界问题&#xff0c;然而无论是 Play in Editor或是 VS选为DebugGame后启动&#xff0c;游戏都没有任何问题&#xff0c;越界问题只在打包后出现。这里记录一下自己的Debug方法。 首先将项目以DebugGame配置打包&#xff1a; 更改打包配置&#xff…

asp.net 使用my97 datepicker实现前后两个日期的范围界定

说明&#xff1a;日期选择后&#xff0c;前面的日期小于等后面的日期&#xff0c;后面的日期大于等于前面的日期。点点看就知道了:) &#xff5e; 这里将周末日期不可选。代码如下&#xff1a; 1 <html xmlns"http://www.w3.org/1999/xhtml">2 <head runat…

james-2.3.2中的配置

james&#xff1a;1、解压缩2、先运行一遍3、修改配置 apps\james\SAR-INF\config.xml(1)postmaster(2)servername localhost --> abclocalhost j08.com --> abcj08.com 自动检查名称和IP设为false(3)注释掉RemoteAddrNotInNetwork(4)添加虚拟域名&#xff0c;指向localh…

Win7下安装配置gVim

本文根据vim官网的《Simple Steps to Help You Install gVim on Windows 7》【1】一文整理而成。 1. 下载gVim 在http://www.vim.org/download.php/pc 下找到“PC: MS-DOS and MS-Windows”&#xff0c;下载“gvim74.exe”【2】。 2. 安装gVim 1. 安装时可以选择更改目录&#…

ActiveReports 报表控件官方中文入门教程 (2)-创建、数据源、浏览以及发布

ActiveReports 报表控件官方中文入门教程 (2)-创建、数据源、浏览以及发布 原文:ActiveReports 报表控件官方中文入门教程 (2)-创建、数据源、浏览以及发布本篇文章将阐述首次使用 ActiveReports 报表控件 的方法&#xff0c;包括添加报表文件、绑定数据源以及如何发布报表等内…

C++ Lambda表达式基本用法

创建一个匿名函数并执行。采用的是配对的方括号[]。实例如下&#xff1a; 1 2 3 4 5 6 7 8 9 #include <iostream> using namespace std; int main() { []{ cout << "Hello,Worldn"; }(); } 我们也可以方便的将这个创建的匿名函数赋…

每日一测4(装箱与拆箱)

1、定义 装箱&#xff1a;用于在垃圾回收堆中存储值类型。装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。 拆箱&#xff1a;从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。 2、为什么要装箱&#xff1a; &#xff08;1&#x…

flex 正则表达式匹配规则

正则表达式扫描的优先级 1. 先根据空格&#xff0c;tab&#xff0c;回车分割字符串&#xff0c;作为正则表达式匹配的基础 2. 找到完全匹配的正则表达式&#xff0c;以排列在前面的优先级为高 3. 如果找不到匹配的表达式&#xff0c;那么从头开始截取字符串来查找合…

笔记本多硬盘win7下U盘安装Cnetos7引导问题!

CentOS7出来的时间已经不算短了&#xff0c;前段时间一直在虚拟机上使用&#xff0c;最近闲下来了&#xff0c;就像在自己的笔记本上装一个win7和Centos7的双系统体验以下实体机的效果&#xff0c;几经波折之后终于顺利的装上了WIN7和CentOS7的双系统&#xff01;在这里主要是想…

QString转char*的问题

QString tmp"abc"; char *p tmp.toLatin1().data()); QString tmp"abc"; char *p new char[1strlen(tmp.toLatin1().data())]; strcpy(p, tmp.toLatin1().data()); 运行模式两种方法都可以&#xff0c;调试模式&#xff0c;第一种方式无法得到QString的…

hdu 1870

水题。。。。 AC代码&#xff1a; #include <iostream> #include <queue> using namespace std; int main() {char str[1010];int i,k;while(scanf("%s",&str)!EOF){queue<char>q;for(i0;str[i]!B;i){if(str[i]()q.push(str[i]);if(str[i]))q.…

Linux Apache php MySQL 安装配置(Centos 6.4 yum安装)

一、yum准备 1.Yum&#xff08;全称为 Yellow dog Updater, Modified&#xff09;是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。 基于RPM包管理&#xff0c;能够从指定的服务器自动下载RPM包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安…

QComboBox 样式设置

QComboBox QAbstractItemView::item:hover {color: black;background-color: lightgreen; } 上面理论上是对鼠标划过的项目的样式设置&#xff0c;实际不管用 QComboBox QAbstractItemView { color:black; selection-background-color:yellow; background-color:white; } 上…

函数IsValid()

函数IsValid() 功能&#xff1a;检查对象变量是否已经实例化&#xff0c;即实例变量的值是否是个有效的对象句柄。 语法&#xff1a;IsValid(objectname) 参数&#xff1a;objectname:要检查的对象名。 返回值&#xff1a;Boolean。如果指定对象已经创建了对此案实例&#xff0…