Unity3DBehaviorDesigner⾏为树4打断机制的实现守护甜心37
环境:Unity2018.3 语⾔:C#
上篇⼩作业解答:
Behavior Manager在Disable之后直接运⾏会⽣成⼀个新的Behavior Manager。
总起:
⾏为树的节点不总是从上⾄下从左⾄右顺序执⾏的,在复合节点上有⼀个Abort Type参数。
英国 公投
刘一男考研词汇5500该参数可以决定复合节点下的条件节点状态发⽣变化时,是否能打断当前⼦节点(lf)、优先级⽐⾃⼰低的节点的执⾏(Lower Priority)。
打断机制:
⾏为树中拥有许多容器变量:tribunal
1. taskList,所有的Task节点;
2. conditionReevaluate,条件节点的状态缓存;
3. activeStack,当前运⾏中Task的堆栈,⾏为树在启动时会新建⼀个,在碰到每个并⾏分⽀时会新建⼀个。on more
妊妇⾏为树的每次执⾏时⼀次Tick,最终会执⾏到当前在执⾏Task的OnUpdate,但是在此之前会执⾏ReevaluateConditionalTasks⽅法将当前缓存的条件节点重新判断⼀遍。
inconclusion
具体的判断如下:
从conditionReevaluate获取需要判断的条件节点后,执⾏⼀次OnUpdate,如果其返回值与存储的状态不同,则开始打断。
将需要打断的任务从activeStack中弹出,并将正在运⾏中任务的结果置为Failure。
最后从当前节点往上追溯,调⽤其所有节点的OnConditionalAbort,并更新条件节点NodeData中的InterruptTime——被打断的时间。
打断的条件:
上⼩结中介绍了打断的基本流程,其中打断类型有四种:None、Self、LowerPriority、Both。
⾏为树中条件状态缓存conditionReevaluate,在条件节点运⾏时会加⼊该容器,但是有两个条件:
ever since
1. 该Task必须继承Conditional,也就是条件节点(其实Conditional和Action的运⾏⽅式基本等同,如果不需要打断的功能Action节
点完全可以替代Conditional节点。所以打断功能应该就是Conditional节点和Action节点的本质区别);
2. AbortType必须不是AbortType.None。
加⼊到缓存中时,如果不是LowerPriority则会记录compositeParentIndex⽗复合节点的索引,否则为-1。
这边就有些奇怪了,因为在执⾏打断流程前有个判断:
ppmm是什么意思
也就是说LowerPriority类型初始值并不会打断。断点看⼀下:
英语作业本八下答案只要Task运⾏过便会进⾏赋值,⽽打断时conditionReevaluate会重置。