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

BTActionUniversal.lua

  1. --[[
  2. 通用Action节点
  3. --]]
  4. BTActionUniversal = BTAction:New();
  5.  
  6. local this = BTActionUniversal;
  7. this.name = "BTActionUniversal";
  8.  
  9. function this:New(enterFunc, executeFunc, exitFunc)
  10. local o = {};
  11. setmetatable(o, self);
  12. self.__index = self;
  13. o.enterFunc = enterFunc;
  14. o.executeFunc = executeFunc;
  15. o.exitFunc = exitFunc;
  16. return o;
  17. end
  18.  
  19. function this:Enter()
  20. if (self.enterFunc) then
  21. self.enterFunc();
  22. end
  23. end
  24.  
  25. function this:Execute()
  26. if (self.executeFunc) then
  27. return self.executeFunc();
  28. else
  29. return BTTaskStatus.Failure;
  30. end
  31. end
  32.  
  33. function this:Exit()
  34. if (self.exitFunc) then
  35. self.exitFunc();
  36. end
  37. end

BTConditionalUniversal.lua

  1. --[[
  2. 通用Conditional节点
  3. --]]
  4. BTConditionalUniversal = BTConditional:New();
  5.  
  6. local this = BTConditionalUniversal;
  7. this.name = "BTConditionalUniversal";
  8.  
  9. function this:New(checkFunc)
  10. local o = {};
  11. setmetatable(o, self);
  12. self.__index = self;
  13. o.checkFunc = checkFunc;
  14. return o;
  15. end
  16.  
  17. function this:Check()
  18. return self.checkFunc();
  19. end

TestBehaviorTree.lua

  1. TestBehaviorTree = BTBehaviorTree:New();
  2.  
  3. local this = TestBehaviorTree;
  4. this.name = "TestBehaviorTree";
  5.  
  6. function this:New()
  7. local o = {};
  8. setmetatable(o, self);
  9. self.__index = self;
  10. o:Init();
  11. return o;
  12. end
  13.  
  14. function this:Init()
  15. local sequence = BTSequence:New();
  16. local conditional = self:GetBTConditionalUniversal();
  17. local action = self:GetBTActionUniversal();
  18. local log = BTLog:New("This is log!!!");
  19. log.name = "log";
  20.  
  21. self:SetStartTask(sequence);
  22.  
  23. sequence:AddChild(conditional);
  24. sequence:AddChild(action);
  25. sequence:AddChild(log);
  26. end
  27.  
  28. function this:GetBTConditionalUniversal()
  29. local a = function ()
  30. return ( > );
  31. end
  32. local universal = BTConditionalUniversal:New(a);
  33. return universal;
  34. end
  35.  
  36. function this:GetBTActionUniversal()
  37. local count = ;
  38. local a = function () print(""); end
  39. local b = function ()
  40. if (count < ) then
  41. count = count + ;
  42. print("");
  43. return BTTaskStatus.Running;
  44. else
  45. return BTTaskStatus.Success;
  46. end
  47. end
  48. local c = function () print(""); end
  49. local universal = BTActionUniversal:New(a, b, c);
  50. return universal;
  51. end

打印如下:

[Unity插件]Lua行为树(十):通用行为和通用条件节点的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. [Unity插件]Lua行为树(二):树结构

    参考链接:https://blog.csdn.net/u012740992/article/details/79366251 在行为树中,有四种最基本的节点,其继承结构如下: Action->T ...

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

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

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

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

随机推荐

  1. 【python】序列化和反序列化

    序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式字符串解码为python数据对象.在python的标准库中,专门提供了json库与pickle库 ...

  2. Thinkphp 视图模型

    1.创建视图模型 2.定义视图模型 class BlogViewModel extends ViewModel { public $viewFields = array( 'Blog'=>arr ...

  3. vi命令【方向键】变字母键的解决方法

    vi命令[方向键]变字母键的解决方法   最近在SSH下玩Debian发现了一个有趣的现象,就是在一些个别版本的Debian镜像下,使用vi命令时会出现键盘输出出错的现象,使用方向键时会变成C,D等字 ...

  4. js copy数组 对象

    js copy数组 slice  concat  浅拷贝 copy 对象 Object.assign({},obj);  es6 ie要用babel转 暴力copy 用JSON.parse(JSON. ...

  5. 阿里云kubernetes遭入侵pubg进程占用cpu资源100%解决方法

    发现服务器CPU占用100%,通过top命令发现pubg -c config.json -t 2占用CPU资源,kill进程会自动启动.黑客入侵方式是kubernetes创建pod. Name: ku ...

  6. Java学习——多线程例子:银行

    package cys; public class Example9_3 { public static void main(String[] args) { // TODO Auto-generat ...

  7. jquery插件的几种写法

    /** * Created by peng on 2016/12/8. */jQuery.extend({ min: function(a, b) { return a < b ? a : b; ...

  8. 自定义鼠标右键(层叠式菜单:cascading menu)

    Author:KillerLegend From:http://www.cnblogs.com/killerlegend/p/3575391.html Date:Tuesday, February 1 ...

  9. jQuery版本问题,及事件源

    jQuery版本的分界线是2.0 2.0之前很多方法支持ie低版本,2.0之后就不支持了 工具:index() 指定元素的索引  (有参数) 不传参的情况下,父级元素下同级元素的排名,传参:指定元素的 ...

  10. [UE4]关卡蓝图