参考链接: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. ecstore开启发送邮件日志,并且排查邮件发布出去原因

    config.php里 define("MAIL_LOG", true);//发送邮件日志开启2017-04-19 10:29:31 解决sendmail connection r ...

  2. php限制文件下载速度的代码

    有时候你会出于某种目的而要求把下载文件的速度放慢一些,例如你想实现文件下载进度条功能.限制下载速度最大的好处是节省带宽,避免瞬时流量过大而造成网络堵塞.本文将和你分享如何通过php代码来实现限制文件的 ...

  3. ML: 降维算法-LE

    PCA的降维原则是最小化投影损失,或者是最大化保留投影后数据的方差.LDA降维需要知道降维前数据分别属于哪一类,而且还要知道数据完整的高维信息.拉普拉斯特征映射 (Laplacian Eigenmap ...

  4. VTC Fsync_out信号分析

    VTC Fsync_out信号分析 1.GUI配置 Vertical position的值289是根据Frame/Field 0 Vertical settings一栏中sync start来设置的. ...

  5. PHP用ActiveMq 实现消息列队

    1.各种安装 2.简单配置: jetty.xml localhost:8161 配置: activemq添加stomp的61613接口 conf/activemq.xml <transportC ...

  6. ☞上一篇无聊文章 分析网站CSS构架流程(一)

    1.无力吐槽 2.reset.css 3.功能css() 4.单页面CSS 5.网站通用样式库 6.图标文件库

  7. Azure Storage (26) HTML5播放Azure Storage MP4问题

    <Windows Azure Platform 系列文章目录> 问题:客户描述说在Azure Storage上的MP4视频无法在线播放,只能看到黑屏的视频,有声音但是没有图像 问题排查:H ...

  8. 数据仓库专题20-案例篇:电商领域数据主题域模型设计v0.2(改进意见征集中)

    一.电商分类(平台+自营+复合) (1)平台型电商:淘宝+天猫+百度Mall等: (2)自营型电商: 2.1 综合型:京东(早期)+当当(早期): 2.2 垂直型:好像这种类型越来越少了: (3)复合 ...

  9. 【java】之Method和Field反射获取和设置属性值

    package com.javaluna.reflect; import java.lang.reflect.Field; import java.lang.reflect.Method; impor ...

  10. Linux bash笔记

    关于bash脚本,一般开头都加#!/bin/bash,表示以bash来作为脚本解释器:如果不加的话,就会默认当前用户登陆的shell为脚本解释器(很多情况下为sh,sh与bash不同,有可能导致脚本无 ...