【转】behave行为树学习使用第一天

最近在学习使用行为树做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)

时间: 2024-12-29 04:35:09

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

Trie树学习2

数组实现的Trie树 字符容量有限,可以使用链表实现更为大容量的Trie #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdlib> #

学习python第一天

学习Python第一天 Python小白,做Linux运维5年,纯系统运维已经不能满足日常工作需要,所以学习Linux运维开发入门级语言python 前言: Python, 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议. Python语法简洁清晰,特色之一是强制用空白符(white

Java学习记录第一章

学习Java第一章的记录,这一章主要记录的是Java的最基础部分的了解知识,了解Java的特性和开发环境还有Java语言的优缺点. 计算机语言的发展大概过程:机器语言--->汇编语言--->高级语言(面向过程的语言和面向对象的语言)总而言之就是从人类比较难识别的字符串向人类自然语言靠近使代码的可读性越来越高. Java的发展过程:1991年Sun公司为了抢占市场先机,成立了一个称为Green的项目小组,帕特里克.詹姆斯·高斯林.麦克·舍林丹和其他几个工程师一起组成的工作小组在加利福尼亚州门洛帕

B树(B+树) 学习总结

一,B树的定义及介绍 为什么会有B树? 熟悉的树的结构有二叉树查找树或者平衡二叉树……平衡二叉树保证最坏情况下各个操作的时间复杂度为O(logN),但是为了保持平衡,在插入或删除元素时,需要进行旋转啊...一系列操作,因此实现起来比较复杂.而对于二叉查找树,基本操作在最坏情况下会出现O(N)的时间复杂度.总之,这些树都是针对于内存中的数据操作,它们每个结点最多只有两个孩子,当数据量大时(结点数目很多),就会导致树很高.但由于基本操作(查找元素.插入元素)都是在内存中实现,因此,树高点也就没有太大

Duilib学习二 第一个程序 Hello World

Duilib学习二  第一个程序 Hello World #pragma once #include <UIlib.h> using namespace DuiLib; #ifdef _DEBUG # ifdef _UNICODE # pragma comment(lib, "DuiLib_ud.lib") # else # pragma comment(lib, "DuiLib_d.lib") # endif #else # ifdef _UNICOD

UI学习笔记---第一天

一.iOS概述 iOS是Apple公司的移动操作系统,主要?用于iPhone.iPad.iPad Mini.iPod Touch等移动产品. 借助iOS,我们可以开发视频类.美图类.新闻类.?音乐类.团购类.电商类.阅读类.出?行类.?生活服务类.游戏类等应?用程序. 除此之外,iOS还可以与外部设备通信,开发出更多改变?活的产品,?比 如:智能家居(iOS App控制电视.空调等).健?产品(将人体健康 状况通过App直观的展现出来)等. 二.UI概述 UI(User Interface):?

HDU 2966 Aragorn&#39;s Story 树链剖分第一题 基础题

Problem Description Our protagonist is the handsome human prince Aragorn comes from The Lord of the Rings. One day Aragorn finds a lot of enemies who want to invade his kingdom. As Aragorn knows, the enemy has N camps out of his kingdom and M edges c

我的linux学习,第一天!

毕业很久了,虽然一直在做网络管理圆.但是linux的东西已经丢的差不多了. 处于对未来发展以及职业规划方面,就决定把linux捡起来. 在网上找了很多linux相关书籍和教程等方面的东西. 最后决定书籍以<鸟哥的私房菜>入手,教程以马哥教育视频开始. 放弃懒散.选择坚持. 三个月后,再看结果! 加油,加油,加油!!! 我的linux学习,第一天!,布布扣,bubuko.com

CCNA学习指南 第一、二章 下载

ccna学习指南出版稿公布. 本博文公开第一.二章,其它章逐步公开. CCNA学习指南 第一.二章 下载