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

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

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 (2 > 1);
31     end
32     local universal = BTConditionalUniversal:New(a);
33     return universal;
34 end
35
36 function this:GetBTActionUniversal()
37     local count = 1;
38     local a = function () print("11"); end
39     local b = function ()
40         if (count < 3) then
41             count = count + 1;
42             print("22");
43             return BTTaskStatus.Running;
44         else
45             return BTTaskStatus.Success;
46         end
47     end
48     local c = function () print("33"); end
49     local universal = BTActionUniversal:New(a, b, c);
50     return universal;
51 end

打印如下:

原文地址:https://www.cnblogs.com/lyh916/p/9657073.html

时间: 2024-10-04 08:16:01

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

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

条件节点和行为节点,这两种节点本身的设计比较简单,项目中编写行为树节点一般就是扩展这两种节点,而Decorator和Composite节点只需要使用内置的就足够了. 它们的继承关系如下: Conditional->Task Action->Task 代码如下: BTAction.lua 1 BTAction = BTTask:New(); 2 3 local this = BTAction; 4 5 function this:New() 6 local o = {}; 7 setmetata

[Unity插件]AI行为树使用总结

参考链接: https://blog.csdn.net/linxinfa/article/details/72937709 https://blog.csdn.net/wanghaodiablo/article/details/52587364 https://blog.csdn.net/q414620221/article/details/78596732 0.节点 一般情况下,只需要扩展Conditional和Action这两种节点即可,Decorator和Composite节点只需要使用内

Unity中的行为树插件:Behavior Designer

外国技术人员的插件:http://www.opsive.com/assets/BehaviorDesigner 目前公司内部比较推崇的行为树插件就是这个,虽然有其他几个同类的竞品. 说一句题外话,优秀的插件总是外国人开发的,并且可以将插件开发做成一个小工作室或者个人的主要收入来源,但没看到国人有类似的作品出现. 行为树的概念出现已经很多年了,总的来说,就是使用各种经典的控制节点+行为节点进行组合,从而实现复杂的AI.目前在游戏中一般复杂的AI都可以看到行为树的身影,简单的AI可以使用状态机来实现

C#程序员整理的Unity 3D笔记(二十):2D Toolkit之官方教程《Whack a Mole》

在上篇博客中,简单整理了一下Unity Native 2D功能:<C#程序员整理的Unity 3D笔记(十九):Unity 3D的Native 2D>. 本文开始学习2D商用比较广泛的2D Toolkit插件. 2D Toolkit插件在2D中的地位,犹如UI中NGUI对Unity GUI一样:虽然官方原生的2D还不错,但这是最近1年新版本才有的功能,2年前Unity 2D的王道还是得用插件的,故<2D Toolkit>就成了目前商业不错的选择. 在上周刚开始看的时候,就给自己提了

Unity插件之NGUI学习(4)—— 创建UI2DSprite动画

创建一个新的Scene,并按 Unity插件之NGUI学习(2)创建UI Root,并在UI Root的Camera下创建一个Panel. 然后在选中Panel,在菜单中选择NGUI->Create->Unity 2D Sprite 查看Inspector窗口 接着是在Unity中制作Sprite: 在Project窗口创建Textures文件夹,并从外部拖入一些图片素材,然后选中需要转成Sprite的图片,然后在Inspector窗口进行转变Sprite的操作,如图. 选择Sprite(2D

利用jstree插件轻松构建树应用

利用jstree插件轻松构建树应用 最近完成了项目中的一个树状应用,第一次接触了jstree这个插件,总的来说它的官方文档还是比较详细的,但是在使用过程中还是出现了一些问题,下面我就来谈谈这款插件的使用和心得. 首先项目需要构建一棵树,利用jstree插件我们先在页面上静态的把这棵树渲染出来,参照官方文档(http://www.jstree.com/),代码如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head&g

Unity插件之NGUI学习(9)—— Tween和世界坐标系尺寸转换为NGUI尺寸

在游戏中,有一种比较常见的动画效果,就是产生得分后,分数会在游戏中显示,并快速移动到总分的位置并使之相加.今天我就打算使用NGUI的Tween来制作这种分数动画效果. 根据 Unity插件之NGUI学习(2),创建一个UI Root,然后使用NGUI创建一个Label和一个Button. 在Project窗口中,在Resources/Prefabs文件夹中创建一个Prefab,该Prefab就是一个NGUI的Label,然后在菜单中选择NGUI->Tween->Rotation和NGUI-&g

【VR】Leap Motion 官网文档 Unity插件概述

前言: Leap Motion的官网文档已经有不少的热心网友参与了翻译,但没有覆盖官网文档的全部. 为迎合Unity VR的热潮与大家的学习需要,本博客将推出针对Unity方向的官方文档翻译系列. 本篇主要对Leap Motion的Unity插件及坐标系系统进行简述. 英文原文网址:https://developer.leapmotion.com/documentation/unity/unity/Unity_Overview.html 译文首发&持续更新:http://blog.csdn.ne

CCNA实验三十六 GRE(通用路由封装) &nbsp;

CCNA实验三十六 GRE(通用路由封装) 环境:Windows XP .Packet Tracert5.3 目的:了解GRE的使用,掌握如何配置GRE. 说明: GRE(Generic Routing Encapsulation,通用路由封装)协议是对某些网络层协议(如IP 和IPX)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IP)中传输.GRE采用了Tunnel(隧道)技术,是VPN(Virtual Private Network)的第三层隧道协议. Tunnel