最近在学习使用行为树做AI,决定把学到的贡献出来,抛砖引玉,希望可以认识到更多大牛

-- 首先我们了解下什么是行为树和为什么要使用行为树。 
  在我们项目中如果需要做一个AI敌人,比如做一个手游 某民突击里面的普通步兵,那么这个步兵的基本ai 就是 从出生点出来后获取一个躲避点,然后向躲避点跑动,当到达躲避点后,开始做各种动作 向玩家开枪,当开枪完后执行躲避动作,躲避动作完成后可能继续开枪,或者又跑到其他躲避点,然后就是一个循环。 那么做这个ai 一般会用fsm状态机来写,通过不同的状态 来调用具体的方法,状态机有效的解决了代码的扩展性问题,使得开发变得很清晰,代码之间的耦合性也分的比较好。 但是,状态机也有些弊端,比如代码不能重用,如果一个项目特别的大,状态之间的切换会变得很复杂,维护状态机也会变得麻烦。所以这个时候就需要用行为树来做解决方案了。当然,这里指的是状态机做得足够大才会出现的问题,目前我做的ai还不至于到状态机撑爆,那你说我为什么我还要学行为树呢 ,<ignore_js_op> 没错 ,就是为了学(zhuang)习(bi)。
好,废话说了那么多,那我们现在来进入正题。
-------
首先我们用的是Behave 行为树插件,目前这个插件好像unity商店已经没有了,我会在后面提供给大家。
首先导入这个插件, 会在项目中出现一个 <ignore_js_op> 这样的文件夹,里面就包含了全部behave插件的内容了
然后我们点击project的create library <ignore_js_op>   创建一个 库 然后点击这个库  inspector 面板就会出现几个选项 ,我们点击edit library 
然后unity会多出来两个窗口 一个behave editor 和 behave browse  我们的行为树就是在这两个面板进行创建和编辑了 然后我们点击behave browse  面板的create 
create一个collection  ,继续 再create一个tree 这样我们就有一个空的行为树了 ,接下来 我们选中新创建的NewTree1 在behave editor面板就会多出来7个选项在下面,
这7个就是我们要学的行为树的内容了  后面我会逐个介绍 , 首先介绍 那个小圆圈的那个 就是一个行为节点 ,我们把小圆圈拖到上面,然后改名叫MyAction,
然后在顶部中间的方块拉出一条线,连线到我们的小圆圈顶上,这样就建立起来了一个连接。<ignore_js_op> 
ok,现在我们画出来了一个行为节点,怎么去执行这个节点呢,或者说去编辑这个节点的代码呢 ,这时候我们新建一个脚本,就叫MyAction.cs 
然后添加引用 
using Behave.Runtime;
using Tree = Behave.Runtime.Tree;
声明一个静态变量,再引用行为树。
在MonoBehaviour后面再加一个继承,IAgent 接口,然后实现这些方法 。
增加一个类Tree m_Tree;
再改写Start方法为 IEnumerator Start() 
Start方法使用库里面的InstantiateTree 静态方法,再用一个死循环来调用一个AIUpdate方法 在AIUpdate里面执行 行为树的Tick() 方法,每当行为节点被调用时,都会调用这个Tick方法就是实例的默认方法,我们开始重新改写这几个方法,换成我们自己的方法。

好,现在我们开始改写从接口实现下来的方法,一共有3个

public void Reset(Tree sender){  }

public int SelectTopPriority(Tree sender, params int[] IDs){

return 0;

}

public BehaveResult Tick(Tree sender, bool init) {

Debug.Log("调用系统的Tick方法 " +
            (BLAgentBehaveLib.IsAction(sender.ActiveID) ? "Action " : "Decorator ") + " ... " +
            (BLAgentBehaveLib.IsAction(sender.ActiveID) ? ((BLAgentBehaveLib.ActionType)sender.ActiveID).ToString() :
            ((BLAgentBehaveLib.DecoratorType)sender.ActiveID).ToString())
        );
                return BehaveResult.Success;

}

这里的tick 就会输入我们自己的tick方法了
好了,这个时候就到我们刚才的MyAction的行为节点的代码了 
现在 ,我们开始加入实现MyAction 节点的代码   这里有个命名规则 
BehaveResult Tick+"你的行为节点的名字"+Action(Tree sender)

[C#] 纯文本查看 复制代码
 
1
2
3
4
public BehaveResult TickMyactionAction(Tree sender)
  {
      Debug.Log("我的action");
      return BehaveResult.Success;
  }

记住,脚本的方法名字一定要和行为节点一模一样  否则他就调不到,就回去调Tick方法了
这时候你的代码应该是这样的  
<ignore_js_op>

然后我们运行一下,就可以看到我们写的myAction方法了
<ignore_js_op>

好了,我们第一天的介绍就到这里,目前我们就学习了 behave 这个插件的基本搭建和调用了一个最简单的Action节点了

下面是源码  里面还有我新的学习情况,会多出几个内容,将在后面在介绍
写得好辛苦,就小小收几个币吧

unity3d 行为树;unity 本身的行为树插件;

<ignore_js_op>

3.png (84.52 KB, 下载次数: 0)

<ignore_js_op>

2-3.png (558.86 KB, 下载次数: 0)

【转】behave行为树学习使用第一天的更多相关文章

  1. RabbitMQ学习总结 第一篇:理论篇

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  2. 学习KnockOut第一篇之Hello World

    学习KnockOut第一篇之Hello World 笔者刚开始学习KnockOut.写的内容就相当于一个学习笔记.且在此处向官网致敬,比较喜欢他们家的Live Example版块,里面有jsFiddl ...

  3. ActionBarSherlock学习笔记 第一篇——部署

    ActionBarSherlock学习笔记 第一篇--部署          ActionBarSherlock是JakeWharton编写的一个开源框架,使用这个框架,可以实现在所有的Android ...

  4. Java学习记录第一章

    学习Java第一章的记录,这一章主要记录的是Java的最基础部分的了解知识,了解Java的特性和开发环境还有Java语言的优缺点. 计算机语言的发展大概过程:机器语言--->汇编语言---> ...

  5. zkw线段树学习笔记

    zkw线段树学习笔记 今天模拟赛线段树被卡常了,由于我自带常数 \(buff\),所以学了下zkw线段树. 平常的线段树无论是修改还是查询,都是从根开始递归找到区间的,而zkw线段树直接从叶子结点开始 ...

  6. 仙人掌&圆方树学习笔记

    仙人掌&圆方树学习笔记 1.仙人掌 圆方树用来干啥? --处理仙人掌的问题. 仙人掌是啥? (图片来自于\(BZOJ1023\)) --也就是任意一条边只会出现在一个环里面. 当然,如果你的图 ...

  7. oracle学习笔记第一天

    oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字   1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...

  8. javascript的ES6学习总结(第一部分)

    ES6(ESNext学习总结——第一部分) ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版. ECMA每年6月份,发布一个版本 201 ...

  9. Web基础学习---HTML 第一天

    Web基础学习---HTML 第一天 1 HTML标签 2.CSS Web开发基础HTML好吧离开Python几天...如何学好前端?? 多去看别人的网站.多看.多写.多练,(知乎.36Kr.)多练就 ...

随机推荐

  1. UVA 11990 ``Dynamic'' Inversion (线段树套BIT,分治)

    题目要求可转化为查询一个区间内有多少数比val大(或者小). 区间用线段树分解(logN),每个区间维护一rank树. rank可用BIT查询,往BIT里面插值,为了保证不同区间的BIT互不影响要先离 ...

  2. 2018.5.14 XML文档类型定义----DTD

    1.DTD概述 一个完全意义上的XML文件不仅仅是Well-fromed(格式良好的),而且还应该是使用了一些自定义的标记ValidatingXMl(有效的)文档也就是说他必须遵守文档类型的定义中已声 ...

  3. @TransactionConfiguration过时与替代写法

    在使用了Spring的项目中做单元测试时,以前的标准写法是这样的: 但是在高版本的Spring框架中(Spring4.2以后),@TransactionConfiguration已经标注为过时的注解, ...

  4. 推荐一个WebIDE在线编程语言编译器C9.io

    有时借用别人电脑或者不想在电脑上安装各种乱七八糟的IDE,就可以考虑 Web IDE.随着Web技术发展,很多语言的编译工作都可以利用Web 浏览器来完成. 1. 推荐国外的 C9.io 个人可以免费 ...

  5. shiro学习记录(二)

    1 在项目中应用shiro框架进行认证 第一步:引入shiro框架相关的jar <!-- 引入shiro框架的依赖 --> <dependency> <groupId&g ...

  6. 巧妙使用JQuery Clone 添加多行数据,并更新到数据库

    WEB代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="BatchAdd. ...

  7. jfinal excel表导出

    在自己的WEB项目中要用到导出Excel,所以结合网络上的资源写了一个自己的export 工具类. 说明: JFinal 环境 WEB项目 JAVA后台生成非JS插件 好了,直接撸代码 1.设置文件保 ...

  8. 快速下载jar包

    1, http://www.mvnrepository.com 2,可以从spring官网上下载,如果是mvn的话可以通过上面的网址下载

  9. 在mac下使用python抓取数据

    2015已经过去,这是2016的第一篇博文! 祝大家新年快乐! 但是我还有好多期末考试! 还没开始复习,唉,一把辛酸泪! 最近看了一遍彦祖的文章叫做 iOS程序员如何使用Python写网路爬虫 所以自 ...

  10. mysql 5.7 编译安装脚本。

    此脚本尽量运行在centos 服务器上面,用于编译安装mysql 5.7 将此脚本和相应的软件 都放到/usr/local/src 目录下面 由于不能上传附件  所以需要把cmake-3.9.6.ta ...