UE代码-游戏AI-行为树LoadTree算法解析

UE代码-游戏AI-行为树LoadTree算法解析

首先第一步是看当前行为树是不是已经load过了,枚举LoadedTemplates,一个一个对比,有一样的就返回了

没有就只能新Load一个了
  1. 第一个目标是维护InitList,它是以获取树的深度优先搜索的信息,从Root节点开始调用InitalizeNodeHelper

    1. 将当前点的信息加入InitList(只有当前点是复合节点,进行下两个逻辑)

    2. 枚举当前节点身上的Service,并将Service的信息加入InitList中

    3. 枚举当前点的子节点

      1. 枚举子节点的装饰器,并将装饰器的信息加入InitList中

      2. 根据当前子节点的类型分成三种情况

        1. 当前子节点为子树节点(RunBehavior)时:枚举子树节点的装饰器,并将装饰器的信息加入InitList中

        2. 如果当前子节点是复合节点时:啥也不做

        3. 如果当前子节点是任务节点时:枚举子节点的Service节点,并将Service的信息加入InitList中

        4. Tips:这里有个有趣的地方,对于任务节点service的搜索顺序在其前面,而对于子树节点和复合节点则在前面。

      3. 以子节点为根节点继续深度优先搜索,InitalizeNodeHelper

  2. 获取到InitList的信息后,初始化每个节点的NextExecutionNode,每个节点的NextExecutionNode也就是其树在深度优先搜索后的下一个节点。//用于调试

  3. 将InitList根据内存大小排序,以便更好的打包

  4. 处理节点中的内存信息(对内存大小做了一个前缀和)

  5. 处理好树的信息并存到LoadedTemplates中,树的信息为TemplateInfo,其中:

    1. TemplateInfo.Asset保存着UBehaiorTree
    2. TemplateInfo.Template保存着根节点
    3. TemplateInfo.InstanceMemorySize保存着所有节点的总空间大小
posted @ 2023-06-27 17:22  ccsu_madoka  阅读(96)  评论(0编辑  收藏  举报