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

先看一下之前的条件节点是怎么设计的:

BTConditional.lua

 1 BTConditional = BTTask:New();
 2 
 3 local this = BTConditional;
 4 this.taskType = BTTaskType.Conditional;
 5 
 6 function this:New()
 7     local o = {};
 8     setmetatable(o, self);
 9     self.__index = self;
10     return o;
11 end

BTIsNullOrEmpty.lua

 1 --[[
 2 参考BehaviorDesigner-Conditional-IsNullOrEmpty
 3 --]]
 4 BTIsNullOrEmpty = BTConditional:New();
 5 
 6 local this = BTIsNullOrEmpty;
 7 this.name = "BTIsNullOrEmpty";
 8 
 9 function this:New(text)
10     local o = {};
11     setmetatable(o, self);
12     self.__index = self;
13     o.text = text;
14     return o;
15 end
16 
17 function this:OnUpdate()
18     if (not self.text or self.text == "") then
19         return BTTaskStatus.Success;
20     else
21         return BTTaskStatus.Failure;
22     end
23 end

由上可见,条件节点就是判断条件然后返回成功或者失败,而且也只会有这两种状态,这和if的逻辑是一样的,因此可以改进一下。

BTConditional.lua

 1 BTConditional = BTTask:New();
 2 
 3 local this = BTConditional;
 4 this.taskType = BTTaskType.Conditional;
 5 
 6 function this:New()
 7     local o = {};
 8     setmetatable(o, self);
 9     self.__index = self;
10     return o;
11 end
12 
13 function this:OnUpdate()
14     if (self:Check()) then
15         return BTTaskStatus.Success;
16     else
17         return BTTaskStatus.Failure;
18     end
19 end
20 
21 function this:Check()
22     return false;
23 end

BTIsNullOrEmpty.lua

 1 --[[
 2 参考BehaviorDesigner-Conditional-IsNullOrEmpty
 3 --]]
 4 BTIsNullOrEmpty = BTConditional:New();
 5 
 6 local this = BTIsNullOrEmpty;
 7 this.name = "BTIsNullOrEmpty";
 8 
 9 function this:New(text)
10     local o = {};
11     setmetatable(o, self);
12     self.__index = self;
13     o.text = text;
14     return o;
15 end
16 
17 function this:Check()
18     if (not self.text or self.text == "") then
19         return true;
20     else
21         return false;
22     end
23 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 isNullOrEmpty = BTIsNullOrEmpty:New();
17     local log = BTLog:New("This is log!!!");
18     log.name = "log";
19 
20     self:SetStartTask(sequence);
21 
22     sequence:AddChild(isNullOrEmpty);
23     sequence:AddChild(log);
24 end

打印如下:

猜你喜欢

转载自www.cnblogs.com/lyh916/p/9656327.html