先看一下之前的条件节点是怎么设计的:
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
打印如下:
分类:
Unity插件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?