1,处理黑板
UseBlackboard()(当行为树资源有黑板,并且当前控制器没有黑板或者两个黑板不一样时执行)
2,加载并发起行为树
1,若未初始化行为树组件,新建行为树组件对象
2,BTComp->StartTree()
1,找到树的根节点
2,若行为树已执行并且根节点相同直接返回(所以同一个角色运行两次相同的行为树,他并不会中断当前行为并重新执行任务)
3,StopTree()
4,初始化新的行为树:ProcessPendingInitialize()
1,清除所有实例
2,获取行为树管理器,并添加活跃组件
(BehaviorTreeManager的主要作用就是处理行为树的资源)
(这个活跃组件数组看起来没怎么用到,组件的Tick走的也不是这里,可能是给开发者用的?)
3,新增实例:PushInstance()
1,检查是否可以加载行为树:
1,检查黑板:如果黑板不一致,则不能使用这颗行为树
2,检查能不能获取BTManager
(行为树管理器)
3,如果是运行子行为树,检查能不能执行这棵子树
(调用CanPushSubtree()判断,平行节点的CanPushSubtree返回为false,所以平行节点下面不能Runbehavior)
2,加载树:BTManager->LoadTree()
1,处理每个节点的信息:InitializeNodeHelper()
1,父节点
2,执行顺序
3,内存大小
2,将信息保存在LoadedTemplates中
3,初始化BehaviorTreeInstance与BehaiorTreeInstanceId(看着似乎可以用KnownInstances找到的实例Id)
(BehaiorTreeInstanceId保存了行为树的各种公共信息,也可以通过这些信息来确定一颗行为树,区分BehaviorTreeInstance。)
(BehaiorTreeInstanceId同时预留了部分空间,用于保存执行行为树时的状态等信息用于回滚数据)
1,实例是直接new了一个对象
2,实例Id:UpdateInstanceId
(用KnownInstances去重,没有则新增一个BehaiorTreeInstanceId)
4,将创建好的实例BehaviorTreeInstance推入InstanceStack中(可用InstanceStack找到所有实例)
5,发起请求:RequestExecution()
执行新的任务并在最后ScheduleExecutionUpdate():ScheduleNextTick()
3,执行行为树逻辑
1,tickComponent
1,执行请求:processExecutionRequest()
1,搜索前的准备
2,搜索
3,搜索后的检验与处理
待更新
标签:流程,BehaiorTreeInstanceId,黑板,实例,Ue5,执行,行为,节点 From: https://www.cnblogs.com/whitelily/p/17100961.html