参考链接: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

  1. BTree.Task = {};
  2.  
  3. local this = BTree.Task;
  4.  
  5. function this:New(o)
  6. o = o or {};
  7. setmetatable(o, self);
  8. self.__index = self;
  9. return o;
  10. end

ParentTask.lua

  1. BTree.ParentTask = BTree.Task:New();
  2.  
  3. local this = BTree.ParentTask;
  4.  
  5. function this:New(o)
  6. o = o or {};
  7. o.curChilIndex = ;--当前运行到第几个子节点
  8. o.childTasks = {};--子节点列表
  9. setmetatable(o, self);
  10. self.__index = self;
  11. return o;
  12. end
  13.  
  14. function this:AddChild(task)
  15. local index = #self.childTasks + ;
  16. task.index = index;
  17. task.layer = self.layer + ;
  18. task.parent = self;
  19. task.root = self.root;
  20. end

BehaviorTree.lua

  1. --[[
  2. 树的根节点
  3. --]]
  4. BTree.BehaviorTree = {
  5. layer = ,
  6. };
  7.  
  8. local this = BTree.BehaviorTree;
  9.  
  10. function this:New(o)
  11. o = o or {};
  12. setmetatable(o, self);
  13. self.__index = self;
  14. return o;
  15. end
  16.  
  17. function this:PushTask(task)
  18. task.root = self;
  19. task.parent = self;
  20. task.layer = self.layer + ;
  21. self.startTask = task;
  22. end
  23.  
  24. function this:OnUpdate()
  25. if (self.startTask) then
  26. return self.startTask:OnUpdate();
  27. end
  28. end

BehaviorManager.lua

  1. BTree.BehaviorManager = {};
  2.  
  3. local this = BTree.BehaviorManager;
  4.  
  5. function this.RunTree(tree)
  6. this.bTree = tree;
  7. this.OnUpdate();
  8. end
  9.  
  10. function this.OnUpdate()
  11. local status = this.bTree:OnUpdate();
  12. while (status == BTree.TaskStatus.Running) do
  13. status = this.bTree:OnUpdate();
  14. end
  15. end

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

Log.lua

  1. --[[
  2. 参考BehaviorDesigner-Action-Log
  3. --]]
  4. BTree.Log = BTree.Action:New();
  5.  
  6. local this = BTree.Log;
  7.  
  8. function this:New(text)
  9. local o = {};
  10. setmetatable(o, self);
  11. self.__index = self;
  12. self.text = text;
  13. return o;
  14. end
  15.  
  16. function this:OnUpdate()
  17. print(self.text);
  18. return BTree.TaskStatus.Success;
  19. end

TestBehaviorTree.lua

  1. TestBehaviorTree = BTree.BehaviorTree:New();
  2.  
  3. local this = TestBehaviorTree;
  4.  
  5. function this:New(o)
  6. o = o or {};
  7. setmetatable(o, self);
  8. self.__index = self;
  9. this:Init();
  10. return o;
  11. end
  12.  
  13. function this:Init()
  14. local log = BTree.Log:New("hello world!");
  15. this:PushTask(log);
  16. end

TestMain.lua

  1. require "BehaviorTree/Core/Init"
  2. require "BehaviorTree/Test/TestBehaviorTree"
  3.  
  4. local tree = TestBehaviorTree:New();
  5. 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. Python依赖打包发布详细

    http://www.cnblogs.com/mywolrd/p/4756005.html 将Python脚本打包成可执行文件   Python是一个脚本语言,被解释器解释执行.它的发布方式: .py ...

  2. WPF Demo20 模板

    <Window x:Class="控件模板.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/x ...

  3. Node.js 0.12: 正确发送HTTP POST请求

    Node.js 0.12: 正确发送HTTP POST请求 本文针对版本:Node.js 0.12.4 之前写过一篇Node.js发送和接收HTTP的GET请求的文章,今天再写一篇,讲发送POST的请 ...

  4. python的命令行参数处理

      import argparse # A position argument func_choice = {'client' : 'client function', "server&qu ...

  5. C++进阶--Koenig lookup 依赖于实参的名字查找

    //############################################################################ /* * Koenig Lookup / ...

  6. 服务链路追踪(Spring Cloud Sleuth)

    sleuth:英 [slu:θ] 美 [sluθ] n.足迹,警犬,侦探vi.做侦探 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元.由于服务单元数量众多,业务的 ...

  7. spring4.0之七:Ordering Autowired Collections

    Spring 4.0的一个小特性是在自动注入的时候使用@Order.Spring 2.5中,我们将bean注入List,如下代码: import org.springframework.stereot ...

  8. python图片和字符串的转换

    有个业务,需要将图片压缩转化为64位编码上传到服务端. import json,requests,base64 #网上下载图片素材 r = requests.get("https://tim ...

  9. 一次mysql数据关于union+concat用法的记录

    SELECT CONCAT('SELECT COUNT(*) FROM ',table_name,' union all') FROM information_schema.tables WHERE ...

  10. vue 父组件主动获取子组件的数据和方法 子组件主动获取父组件的数据和方法

    Header.vue <template> <div> <h2>我是头部组件</h2> <button @click="getParen ...