参考链接:https://blog.csdn.net/u012740992/article/details/79366251

在行为树中,有四种最基本的节点,其继承结构如下:

Action->Task

Conditional->Task

Decorator->ParentTask->Task

Composite->ParentTask->Task

对于整棵树,从上往下,可以对其进行分层,从0开始递增;对于树中的子树,从左到右,可以对其子节点标记索引。

那么,这里的整棵树,对应的就是BehaviorTree,而子树,对应的就是ParentTask。同时,为了方便节点之间的访问,可以引入root和parent,表示该节点的根节点和父节点。

然后我们可以通过BehaviorManager去管理所有的树。

整体结构如下:

代码如下:

Task.lua

 BTree.Task = {};

 local this = BTree.Task;

 function this:New(o)
o = o or {};
setmetatable(o, self);
self.__index = self;
return o;
end

ParentTask.lua

 BTree.ParentTask = BTree.Task:New();

 local this = BTree.ParentTask;

 function this:New(o)
o = o or {};
o.curChilIndex = ;--当前运行到第几个子节点
o.childTasks = {};--子节点列表
setmetatable(o, self);
self.__index = self;
return o;
end function this:AddChild(task)
local index = #self.childTasks + ;
task.index = index;
task.layer = self.layer + ;
task.parent = self;
task.root = self.root;
end

BehaviorTree.lua

 --[[
树的根节点
--]]
BTree.BehaviorTree = {
layer = ,
}; local this = BTree.BehaviorTree; function this:New(o)
o = o or {};
setmetatable(o, self);
self.__index = self;
return o;
end function this:PushTask(task)
task.root = self;
task.parent = self;
task.layer = self.layer + ;
self.startTask = task;
end function this:OnUpdate()
if (self.startTask) then
return self.startTask:OnUpdate();
end
end

BehaviorManager.lua

 BTree.BehaviorManager = {};

 local this = BTree.BehaviorManager;

 function this.RunTree(tree)
this.bTree = tree;
this.OnUpdate();
end function this.OnUpdate()
local status = this.bTree:OnUpdate();
while (status == BTree.TaskStatus.Running) do
status = this.bTree:OnUpdate();
end
end

这里可以使用一棵简单的行为树来进行测试:

Log.lua

 --[[
参考BehaviorDesigner-Action-Log
--]]
BTree.Log = BTree.Action:New(); local this = BTree.Log; function this:New(text)
local o = {};
setmetatable(o, self);
self.__index = self;
self.text = text;
return o;
end function this:OnUpdate()
print(self.text);
return BTree.TaskStatus.Success;
end

TestBehaviorTree.lua

 TestBehaviorTree = BTree.BehaviorTree:New();

 local this = TestBehaviorTree;

 function this:New(o)
o = o or {};
setmetatable(o, self);
self.__index = self;
this:Init();
return o;
end function this:Init()
local log = BTree.Log:New("hello world!");
this:PushTask(log);
end

TestMain.lua

 require "BehaviorTree/Core/Init"
require "BehaviorTree/Test/TestBehaviorTree" local tree = TestBehaviorTree:New();
BTree.BehaviorManager.RunTree(tree);

运行环境:Sublime Text 3,使用while循环来代替每帧执行,按F7进行编译,结果如下:

[Unity插件]Lua行为树(二):树结构的更多相关文章

  1. [Unity插件]Lua行为树(十二):行为树管理

    之前运行的行为树,都是一颗总树,那么实际上会有很多的总树,因此需要对行为树进行管理. BTBehaviorManager.lua BTBehaviorManager = {}; local this ...

  2. [Unity插件]Lua行为树(六):打印树结构

    经过前面的文章,已经把行为树中的四种基本类型节点介绍了下.接下来可以整理一下,打印一下整棵行为树.注意点如下: 1.可以把BTBehaviorTree也当作一种节点,这样就可以方便地进行行为树嵌套了 ...

  3. [Unity插件]Lua行为树(一):BehaviorDesigner源码分析

    BehaviorDesigner是Unity上的一款行为树插件,不过这个插件是用C#编写的,编写出来的行为树也是依赖于C#的,不利于热更,所以有必要写一个lua版本的. 首先下载BehaviorDes ...

  4. [Unity插件]Lua行为树(七):行为树嵌套

    在上一篇的基础上,可以测试下行为树的嵌套,所谓的行为树嵌套,就是在一棵行为树下的某一个分支,接入另一棵行为树. 以下面这棵行为树为例: TestBehaviorTree2.lua TestBehavi ...

  5. [Unity插件]Lua行为树(三):组合节点Sequence

    Sequence的继承关系如下: Sequence->Composite->ParentTask->Task 上一篇已经实现了简单版本的ParentTask和Task(基于Behav ...

  6. [Unity插件]Lua行为树(四):条件节点和行为节点

    条件节点和行为节点,这两种节点本身的设计比较简单,项目中编写行为树节点一般就是扩展这两种节点,而Decorator和Composite节点只需要使用内置的就足够了. 它们的继承关系如下: Condit ...

  7. [Unity插件]Lua行为树(十一):组合节点Parallel

    Parallel节点类似Sequence节点,不同在于Parallel会每帧执行所有的节点.当所有节点返回成功时返回成功,当其中一个节点返回失败时,返回失败并且结束所有的子节点运行. 例如说,给Seq ...

  8. [Unity插件]Lua行为树(十):通用行为和通用条件节点

    在行为树中,需要扩展的主要是行为节点和条件节点.一般来说,每当要创建一个节点时,就要新建一个节点文件.而对于一些简单的行为节点和条件节点,为了去掉新建文件的过程,可以写一个通用版本的行为节点和条件节点 ...

  9. [Unity插件]Lua行为树(九):条件节点调整

    先看一下之前的条件节点是怎么设计的: BTConditional.lua BTConditional = BTTask:New(); local this = BTConditional; this. ...

随机推荐

  1. RSA读取密钥——使用openssl编程

    RSA是基于数论中大素数的乘积难分解理论上的非对称加密法.在此密码术中,使用公钥(public key)和私钥(private key)两个不同的密钥:公钥用于加密,它是向所有人公开的:私钥用于解密, ...

  2. Maven下载项目依赖jar包和使用方法

    一.Maven3.5.0安装与配置+Eclipse应用 参考:Maven3.5.0安装与配置+Eclipse应用 二.http://mvnrepository.com/ 此处以http://mvnre ...

  3. 阿里云香港B区通过IPV6规避Google验证码

    最近买了阿里云香港B来FQ,然而被Google的验证码折磨的死去活来.四处查询,终于找到了一个合适的方案. 添加IPV6支持 阿里云香港是没有IPV6地址的,需要一个tunnel,这边使用HE.NET ...

  4. Xilinx AXI总线学习(1)

    Xilinx AXI总线学习 1. AXI GPIO 采用的是AXI4-Lite接口 AXI GPIO Block Diagram Block design: 端口描述: AXI GPIO核有哪些寄存 ...

  5. Intellij IDEA神器值得收藏的小技巧

    概述 Intellij IDEA真是越用越觉得它强大,它总是在我们写代码的时候,不时给我们来个小惊喜.出于对Intellij IDEA的喜爱,我决定写一个与其相关的专栏或者系列,把一些好用的Intel ...

  6. String[]字符串数组,按字典顺序排列大小

    package ltb6w1; public class WordSort1 { private String[] a= {"hello","world",&q ...

  7. 【Java】Java初始化过程总结

    概述 Java字节代码:byte[] Java类在JVM的表现形式:Class类的对象: Java源代码被编译成class字节码 : Java字节代码 --> Class类的对象: 加载:把Ja ...

  8. P1916小书童--大战蚂蚁

    链接 题解:(这里蚂蚁0血也算活...) #include<iostream>#include<cstdio>#include<cmath>using namesp ...

  9. Dubbo(3)Dubbo admin管理控制台

    dubbo-admin管理控制台: 可以管理服务,消费,以及其他配置: 在dubbo项目的zip包中有个demo-admin项目,可以打成war包,发布到tomcat运行里面: 我这里将dubbo-a ...

  10. 判断浏览器是否IE(IE11可用)

    function isIE() { //ie?         if (!!window.ActiveXObject || "ActiveXObject" in window) { ...