[Unity插件]Lua行为树(二):树结构
参考链接: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行为树(二):树结构的更多相关文章
- [Unity插件]Lua行为树(十二):行为树管理
之前运行的行为树,都是一颗总树,那么实际上会有很多的总树,因此需要对行为树进行管理. BTBehaviorManager.lua BTBehaviorManager = {}; local this ...
- [Unity插件]Lua行为树(六):打印树结构
经过前面的文章,已经把行为树中的四种基本类型节点介绍了下.接下来可以整理一下,打印一下整棵行为树.注意点如下: 1.可以把BTBehaviorTree也当作一种节点,这样就可以方便地进行行为树嵌套了 ...
- [Unity插件]Lua行为树(一):BehaviorDesigner源码分析
BehaviorDesigner是Unity上的一款行为树插件,不过这个插件是用C#编写的,编写出来的行为树也是依赖于C#的,不利于热更,所以有必要写一个lua版本的. 首先下载BehaviorDes ...
- [Unity插件]Lua行为树(七):行为树嵌套
在上一篇的基础上,可以测试下行为树的嵌套,所谓的行为树嵌套,就是在一棵行为树下的某一个分支,接入另一棵行为树. 以下面这棵行为树为例: TestBehaviorTree2.lua TestBehavi ...
- [Unity插件]Lua行为树(三):组合节点Sequence
Sequence的继承关系如下: Sequence->Composite->ParentTask->Task 上一篇已经实现了简单版本的ParentTask和Task(基于Behav ...
- [Unity插件]Lua行为树(四):条件节点和行为节点
条件节点和行为节点,这两种节点本身的设计比较简单,项目中编写行为树节点一般就是扩展这两种节点,而Decorator和Composite节点只需要使用内置的就足够了. 它们的继承关系如下: Condit ...
- [Unity插件]Lua行为树(十一):组合节点Parallel
Parallel节点类似Sequence节点,不同在于Parallel会每帧执行所有的节点.当所有节点返回成功时返回成功,当其中一个节点返回失败时,返回失败并且结束所有的子节点运行. 例如说,给Seq ...
- [Unity插件]Lua行为树(十):通用行为和通用条件节点
在行为树中,需要扩展的主要是行为节点和条件节点.一般来说,每当要创建一个节点时,就要新建一个节点文件.而对于一些简单的行为节点和条件节点,为了去掉新建文件的过程,可以写一个通用版本的行为节点和条件节点 ...
- [Unity插件]Lua行为树(九):条件节点调整
先看一下之前的条件节点是怎么设计的: BTConditional.lua BTConditional = BTTask:New(); local this = BTConditional; this. ...
随机推荐
- 基于Elasticsearch的智能客服机器人
本次分享主要会介绍一下ES是如何帮我们完成NLP的任务的.在做NLP相关任务的时候,ES的相似度算法并不足以支撑用户的搜索,需要使用一些与语义相关的方法进行改进.但是ES的很多特性对我们优化搜索体验是 ...
- 自动加载以及Composer的实现
类的自动加载 两个函数 __autoload()魔术方法.spl_autoload_register 当php文件中使用了new关键字实例化一个对象时,如果该类没有在本php文件中被定义,将会触发__ ...
- JavaScript压缩代码解压缩还原具体办法
我们知道许多网站都对Javascript代码进行了压缩,但这对开发者和学习者来说,读起来很费劲,本文分享给大家在Chrome浏览器中,如何使用Pretty Print功能反压缩JS代码,让代码更加直观 ...
- pytest.5.参数化的Fixture
From: http://www.testclass.net/pytest/parametrize_fixture/ 背景 继续上一节的测试需求,在上一节里,任何1条测试数据导致断言不通过后测试用例就 ...
- 在windows 7中vagrant up 无反应,没任何信息输出
本文转载自:https://blog.csdn.net/cow66/article/details/77993908 我的系统是windows 7 安装了vagrant,当运行vagrant up时, ...
- 【问题解决】使用docker配置redis主从复制,不生效
不生效,解决 原因1:修改 bind 原因2: Slave即的db save失败,因为没有写权限
- 一篇对OAuth2.0开发实例的介绍
今天看到了博友对SSO的文章,SSO单点登录的讲解突然想写一篇关于OAuth2.0用户授权的介绍. 应用场景:在APP或者网页接入一些第三方应用时,时长会需要用户登录另一个合作平台,比如QQ,微博,微 ...
- P1507 NASA的食物计划
传送 01背包又进化了,它变成了二维背包. 既然它多了一个维度,那么我们的f[j]也变成了二维数组f[i][j],其中i表示费用1,j表示费用2 核心方程也相应的变成了f[i][j]=max(f[i- ...
- js面向对象1
1.在空白的Object上加属性和方法: <script type="text/javascript"> function createPerson(name, qq) ...
- mac下面 ,启动2个桌面版appium的方法
分别打开2个终端,分别输入 appium 就可以分别起2个appium桌面版,然后设置端口 即可 参考: https://blog.csdn.net/qq_15283475/article/detai ...