**
本篇旨在讲解如何在游戏项目中配合Lua代码正常使用NodeCanvans行为树框架
**
tips:本篇篇幅过长,主要是讲解NodeCanvas主要代码及接口
首先介绍几个主要的Lua脚本
一、BTConfig.lua
这个脚本主要用于存放全局的节点,包括NodeCanvas自带的组合节点、连接节点、动作节点以及自定义节点,还用于存放全局的节点状态枚举。
所有自定义的节点都要在这里申明。
local PathToClassMap = {
--组合节点
["NodeCanvas.BehaviourTrees.Selector"] = require "Game/LuaBT/BT/Core/Nodes/Composites/Selector",
["NodeCanvas.BehaviourTrees.Sequencer"] = require "Game/LuaBT/BT/Core/Nodes/Composites/Sequencer",
["NodeCanvas.BehaviourTrees.Parallel"] = require "Game/LuaBT/BT/Core/Nodes/Composites/Parallel",
--连接节点
["NodeCanvas.BehaviourTrees.BTConnection"] = require "Game/LuaBT/BT/Core/BTConnection",
--动作节点
["NodeCanvas.BehaviourTrees.ActionNode"] = require "Game/LuaBT/BT/Core/Nodes/Leafs/ActionNode",
["NodeCanvas.BehaviourTrees.ConditionNode"] = require "Game/LuaBT/BT/Core/Nodes/Leafs/ConditionNode",
["NodeCanvas.Framework.ActionList"] = require "Game/LuaBT/BT/Core/Tasks/ActionList",
--自定义节点
["Scenario.Wait"] = require "Game/LuaBT/Custom/Actions/Wait",--延时
}
function BTGetClass(path)
local realClass = PathToClassMap[path]
if not realClass then
print(string.format("%s对应的节点不存在", path))
end
return realClass
end
BTStatus = {
Failure = 0,
Success = 1,
Running = 2,
Resting = 3,
Error = 4,
Optional = 5
}
二、BehaviourTree.lua
这个脚本是NodeCanvas在Lua应用的主干脚本,用于管理整个行为树的行为逻辑,包括每个节点的执行调用、挂起、停止等等,还有一些必须的接口如加载行为树,加载子行为树等操作。
local BehaviourTree = class("BehaviourTree")
function BehaviourTree:ctor()
self.id = 0
self.version = false
self.type = false
self.name = "BehaviourTree"
self.primeNode = false
self.nodes = {
}
self.nodesIndex = {
}
self.subTrees = {
}
self.debugList = {
}
self.rootStatus = BTStatus.Resting
self.agent = {
id = 1001}
self.agent.isBTDebug = false
self.blackboard = false
self.isRunning = false
self.isPaused = false
self.isRepeat = false
self.tickCount = 0
self.time = 0
end
-- 开始执行行为树
function BehaviourTree:start()
self.isRunning = true
self.rootStatus = self.primeNode.status
end
-- 行为树的每帧更新