UE代码-游戏AI-行为树LoadTree算法解析
UE代码-游戏AI-行为树LoadTree算法解析
首先第一步是看当前行为树是不是已经load过了,枚举LoadedTemplates,一个一个对比,有一样的就返回了
没有就只能新Load一个了
-
第一个目标是维护InitList,它是以获取树的深度优先搜索的信息,从Root节点开始调用InitalizeNodeHelper
-
将当前点的信息加入InitList(只有当前点是复合节点,进行下两个逻辑)
-
枚举当前节点身上的Service,并将Service的信息加入InitList中
-
枚举当前点的子节点
-
枚举子节点的装饰器,并将装饰器的信息加入InitList中
-
根据当前子节点的类型分成三种情况
-
当前子节点为子树节点(RunBehavior)时:枚举子树节点的装饰器,并将装饰器的信息加入InitList中
-
如果当前子节点是复合节点时:啥也不做
-
如果当前子节点是任务节点时:枚举子节点的Service节点,并将Service的信息加入InitList中
-
Tips:这里有个有趣的地方,对于任务节点service的搜索顺序在其前面,而对于子树节点和复合节点则在前面。
-
-
以子节点为根节点继续深度优先搜索,InitalizeNodeHelper
-
-
-
获取到InitList的信息后,初始化每个节点的NextExecutionNode,每个节点的NextExecutionNode也就是其树在深度优先搜索后的下一个节点。//用于调试
-
将InitList根据内存大小排序,以便更好的打包
-
处理节点中的内存信息(对内存大小做了一个前缀和)
-
处理好树的信息并存到LoadedTemplates中,树的信息为TemplateInfo,其中:
- TemplateInfo.Asset保存着UBehaiorTree
- TemplateInfo.Template保存着根节点
- TemplateInfo.InstanceMemorySize保存着所有节点的总空间大小