获取目标,就是通过label标签,从字典容器提取

寻找目标,参考LINQ使用Orderby、ThenBy实现多字段的排序,先OrderByDescending降序排列,然后从当前激活的目标队列_activeGoals中,拿到索引为0的,第一个目标即可

两个函数,分别是,调用所有目标的UpdateData更新函数,有包含激活和失效的,和完成当前目标的赋值

目标管理类的,更新数据函数,就是调用以上接口即可

而构造函数,完成各项初始化即可

用于实现IPlanner计划接口的,具体逻辑类,其中声明了,对应实现的_agent代理,在构造函数中,完成传参赋值即可

设置当前状态节点的逻辑入口,这里引入了TreeNode树节点的传参和逻辑; 通过GetNotExistKeys接口,判断当前,总的状态数据合集容器_dataTable是否包含,传参树节点的GoalState状态; 如果不存在,就加到,该树节点,对应的当前状态即可;

这是获取,对于节点的,当前状态,不一样的其余状态的总数

而定义的cost消耗,是等于节点本身的cost,加上不同状态总数,再加上节点对应的Action动作的cost

这个逻辑,是用来解析当前currentNode,所包含的后续影响、先决条件、目标,生成一个subNode节点,后续会用来获取,其中包含的所有cost消耗,跟当前currentNode对比,拿到更低消耗的那个节点

这是获取所有子节点,ActionHandler行为事件容器的函数接口; 通过映射后续影响Effect的EffectsAndActionMap容器,是否包含,目标状态GoalState和当前状态CurrentState的差异key键值,遍历EffectsAndActionMap容器,拿到其中的value,也就是目标的动作事件,加到汇总的handlers队列容器中; 使用OrderByDescending降序排列后,返回的是,目标状态,与当前状态有差异的,动作Handler行为队列容器;

比较,拿到更低消耗节点的GetCheapestNode函数接口,有几种情况的判断,核心的是,先判空,然后消耗Cost字段的比较,如果相等,就对应优先级Priority字段的比较

创建树的最初节点逻辑,也是调用Tree的CreateTopNode接口,完成树节点的创建,然后把目标的后续影响,通过Set接口,设置到节点的目标状态; 再完成消耗的计算,将最初节点topNode设置为,当前状态;

构建动作计划的逻辑入口,先新建一个Tree树,然后基于goal目标,创建最初树节点; 声明一个,最便宜节点cheapestNode,最开始的时候是null空值,还有一个subNode子节点,用来配合当前节点CurrentNode,计算和比较Cost消耗; 通过GetSubHandlers接口,拿到所有的,目标动作事件,然后遍历,动作事件,使用树Tree的CreateNode接口,创建一个TreeNode树节点,作为subNode子节点; 然后通过SetNodeState接口,把当前节点currentNode通过CopyState复制给subNode,还有当前节点的后续影响、先决条件,也是在上述解析的SetNodeState接口,完成在subNode的整合; 通过GetCost接口,拿到subNode的消耗,设置一下父节点; 再通过GetCheapestNode接口,在当前currentNode节点、subNode子节点之间,拿到消耗最低的节点,设为最新的当前currentNode节点,完成Plan计划的逻辑构建,拿到消耗最低的动作树节点;

拿到消耗最低的,动作树节点后,通过BuildPlan接口,塞进总的Queue数据容器即可