UE4中Bebavior Tree中Delay及其后面代码失效的原因
具体原因是因为节点的执行过程中,该节点及其父节点的Decorator条件不满足,而节点又受到flow control的影响,导致中途强制结束了Task节点的执行,具体如下。
UE4中的BehaviorTree(BT),有四种流控制的方式。如下图。每一个选项的作用可以参看链接,本文就不再复制粘贴。讲一个与本文相关的选项,Self,这个选项会一直进行Decorator节点的判断,如果条件不满足,它会立即终止。
而Lantent函数是UE4的蓝图系统中,最接近Unity协程概念的一个东西。Lantent函数最简单的例子就是Delay节点。Lantent函数保存调用Delay时的Context,当Delay时间到时接着Context继续运行。Lantent用单线程模拟多线程环境,省去了很多多线程同步数据的麻烦。具体可以参考链接,以及FLatentActionManager相关代码。例如:
而两者相结合,就会出现问题。在Self选项中,如果条件不满足,self节点会“立即”终止。但是“立即”这个词却很模糊,是当Task节点结束了就“立即”结束,还是Task节点执行到一半,只要self不满足就“立即”结束?经过试验。一般情况下,BT是以节点作为原子操作,也就是说,就算self节点的条件在Task的执行过程中,从满足变成不满足了,BT也会执行完这个Task才进行跳转。但是有一个例外,就是Task节点中有Lantent函数时。当Task节点中的Lantent函数调用时,引擎会保存Lantent函数的Context,如果该节点以及其父节点的self选项变得不满足,Lantent函数所保存的“Context”会被清空,Lantent函数之后的内容都会被清空,Task被强制结束,进行跳转(需要注意的是:Lantent函数中更新Lantent调用时间的函数在删除Context的函数之前,有可能在Duration时间小于每一帧的Delta时间时会执行Lantent函数)。具体可以参考UE4中以下代码。
- EBTNodeResult::Type UBTTask_BlueprintBase::AbortTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
- {
- // force dropping all pending latent actions associated with this blueprint
- // we can't have those resuming activity when node is/was aborted
- BlueprintNodeHelpers::AbortLatentActions(OwnerComp, *this);
- //Something else....
- }
UE4中Bebavior Tree中Delay及其后面代码失效的原因的更多相关文章
- SWT中的Tree中 添加右键弹出菜单
先看一下效果: 如图:在树上单击鼠标右键会弹出 弹出式菜单.做法其实很简单,先做一个树: final TreeViewer treeViewer = new TreeViewer(group, SWT ...
- extjs Tree中避免连续单击会连续请求服务器
应用场景:在项目中我要做一个左边是tree,右边是panel的界面.当我单击tree中的一条记录时,发送请求,并将结果显示在右边的panel中.做完之后发现,如果连续单击就会连续请求两次服务器,毕竟用 ...
- (DT系列四)驱动加载中, 如何取得device tree中的属性
本文以At91rm9200平台为例,从源码实现的角度来分析驱动加载时,Device tree的属性是如何取得的.一:系统级初始化DT_MACHINE_START 主要是定义"struct m ...
- 【转】(DT系列四)驱动加载中, 如何取得device tree中的属性
原文网址:http://www.cnblogs.com/biglucky/p/4057488.html 本文以At91rm9200平台为例,从源码实现的角度来分析驱动加载时,Device tree的属 ...
- [Flex] 组件Tree系列 —— 阻止用户点击选中Tree中分支节点
mxml: <?xml version="1.0" encoding="utf-8"?> <!--功能描述:阻止用户点击选中Tree中分支节点 ...
- [Flex] 组件Tree系列 —— 阻止用户点击选中Tree中任何节点
mxml: <?xml version="1.0" encoding="utf-8"?> <!--功能描述:阻止用户点击选中Tree中任何节点 ...
- 二叉树系列 - 二叉搜索树 - [LeetCode] 中序遍历中利用 pre节点避免额外空间。题:Recover Binary Search Tree,Validate Binary Search Tree
二叉搜索树是常用的概念,它的定义如下: The left subtree of a node contains only nodes with keys less than the node's ke ...
- Windows中的Tree命令
Windows中的Tree命令你会用吗? - 步行者的专栏 - CSDN博客 https://blog.csdn.net/hantiannan/article/details/7663893 (ven ...
- dwz中的(tree)树形菜单的默认收缩
做网站后台时,为了方便管理,可能会用到dwz中的树形菜单,如下: 树形菜单的收缩有默认属性值,可以对其进行一定的初始设定: DWZ的树结构是按<ul>,<li>的嵌套格式构成, ...
随机推荐
- js數字
js數字只有一種類型:不是類型語言. js的數字可以使用科學計數法或者不使用科學計數法: js都是64位的, 如果是整數,(不使用科學計數法或者是小數點)最大15位的: 如果是浮點數,最大17位的,浮 ...
- 科普一下bl锁的知识,没解锁的必看!
今天给大家科普一下. 科普分为两版,一个详细版一个简单版.简单版往下翻. bl是什么?其实详细的我也不知道,我就知道原理和他的全称是bootloader.我们所说的解锁里面的“锁”,就是blbl锁的功 ...
- AWS、Azure和Google的云容器注册表有什么区别?
亚马逊云计算服务(AWS).谷歌云服务和微软Azure,这三大公共云平台都提供Docker容器注册表.虽然他们的产品看起来很相似,但开发人员在做出选择之前,应该先了解价格和功能方面的差异. 公共云供应 ...
- BZOJ2822[AHOI2012]树屋阶梯——卡特兰数+高精度
题目描述 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在一颗高度为N+1尺(N为 ...
- BZOJ1036[ZJOI2008]树的统计——树链剖分+线段树
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v ...
- BZOJ3456 城市规划(多项式求逆)
设f[i]为连通图的数量,g[i]为不连通图的数量,显然有f[i]=2i*(i-1)/2-g[i],g[i]通过枚举1所在连通块大小转移,有g[i]=Σf[j]*C(i-1,j-1)·2(i-j)*( ...
- Luogu3676 小清新数据结构题(树链剖分+线段树)
先不考虑换根.考虑修改某个点权值对答案的影响.显然这只会改变其祖先的子树权值和,设某祖先原子树权值和为s,修改后权值增加了x,则对答案的影响为(s+x)2-s2=2sx+x2.可以发现只要维护每个点到 ...
- JavaScript——根据数组中的某个值进行排序
我这里是根据次数进行倒叙,可根据自己情况进行修改 function sortKey(array,key){ return array.sort(function(a,b){ var x = a[key ...
- asp.net 性能提升
原文链接:http://www.oschina.net/translate/8-ways-improve-asp-net-web-api-performance ASP.NET Web API 是非常 ...
- Java生成多数值二元运算结果集
看之前大学写过的24点程序中用到的核心计算算法——计算四个值能否计算出24,当时用的c++写的,现用Java重写一遍 程序实现了多个数值(可重复),每个数值只能运算一次,二元运算的条件下获得所有结果集 ...