GetRelevantAnimTimeRemainingFraction节点Bug
初始设置:
动画状态机:

MoveStop->Idle的条件:

使用该节点的目的:
在动画蓝图的过渡条件中使用该节点,保证上一个状态的动作完成后进入下一个动作。需求是MoveStop动作完成后才能进入Idle状态。
Bug现象:
启动游戏后,第一次进入该状态时会直接过渡到Idle状态。
此时状态机的状态:

状态机条件:

但是之后再次进入该状态就会正常。状态只会在Move和MoveStop之间过渡。BUG只在启动游戏后第一次进入该状态时出现。
原因:
float UAnimInstance::GetRelevantAnimTimeRemainingFraction(int32 MachineIndex, int32 StateIndex)
{
if(FAnimNode_AssetPlayerBase* AssetPlayer = GetRelevantAssetPlayerFromState(MachineIndex, StateIndex))//AssetPlayer在这里是NULL
{
if(AssetPlayer->GetAnimAsset())
{
float Length = AssetPlayer->GetAnimAsset()->GetMaxCurrentTime();
if(Length > 0.0f)
{
return (Length - AssetPlayer->GetAccumulatedTime()) / Length;
}
}
}
return 0.0f;
}
断点后发现第一次进入该状态时,AssetPlayer为NULL。
FAnimNode_AssetPlayerBase* UAnimInstance::GetRelevantAssetPlayerFromState(int32 MachineIndex, int32 StateIndex)
{
FAnimNode_AssetPlayerBase* ResultPlayer = nullptr;
if(FAnimNode_StateMachine* MachineInstance = GetStateMachineInstance(MachineIndex))
{
float MaxWeight = 0.0f;
const FBakedAnimationState& State = MachineInstance->GetStateInfo(StateIndex);
for(const int32& PlayerIdx : State.PlayerNodeIndices)
{
if(FAnimNode_AssetPlayerBase* Player = GetNodeFromIndex<FAnimNode_AssetPlayerBase>(PlayerIdx))
{
if(!Player->bIgnoreForRelevancyTest && Player->GetCachedBlendWeight() > MaxWeight)
{
MaxWeight = Player->GetCachedBlendWeight();
ResultPlayer = Player;
}
}
}
}
return ResultPlayer;
}
再进入GetRelevantAssetPlayerFromState查看到Player->GetCachedBlendWeight返回结果均为0.
由于状态机切换状态时先执行条件判断,再执行AnimNode的Update。所以未Update过的FAnimNode_AssetPlayerBase的BlendWeight都是0.导致返回的ResultPlayer是nullptr。
void FAnimNode_AssetPlayerBase::Update(const FAnimationUpdateContext& Context)
{
// Cache the current weight and update the node
BlendWeight = Context.GetFinalBlendWeight();
UpdateAssetPlayer(Context);
}
解决办法:

避免GetRelevantAnimTimeRemainingFraction==0。小于0.1且不等于0,过渡条件为true。
注:可能是我自己使用上的问题,若有正确使用方法请告知。
GetRelevantAnimTimeRemainingFraction节点Bug的更多相关文章
- 网络子系统41_inet_peer平衡二叉树的删除
//1.p存在左孩子,则使用p的左孩子的最右孩子替换p,然后重平衡树 //2.p不存在左孩子,则使用p的右孩子替换p,然后重平衡树 1.1 static void unlink_from_pool(s ...
- .Net敏捷开发框架6.1.6.2版本,联系QQ:6539471
演示地址:www.fishcmonkey.com .NET敏捷开发框架 6.1.6.2 版本发布 新增手机流程-我的流程(可查看流程进度和表单内容) 新增手机流程-待办任务(可查看流程进度和表单内容, ...
- 迷你MVVM框架 avalonjs 1.3.9发布
本次升级,avalon改进了许多内部方法,大大提升性能,并且带来异步刷新视图的新功能. ms-html内部不再使用异步 head元素中的avalon元素加入ms-skip指令 重构计算属性,现在超级轻 ...
- [SpriteKit] 制作瓦片地图小游戏
概述 SpriteKit制作瓦片地图游戏,深入了解2D游戏制作过程 详细 代码下载:http://www.demodashi.com/demo/10703.html 说实话这个2D游戏实战的入门看的我 ...
- HDU 1011 Starship Troopers 树形+背包dp
http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:每个节点有两个值bug和brain,当清扫该节点的所有bug时就得到brain值,只有当父节点被 ...
- Jquery实现可拖拽的树菜单
效果图例如以下所看到的:下载地址http://download.csdn.net/detail/javaquentin/8290417 <html xmlns="http://www. ...
- hive 总结四(优化)
本文参考:黑泽君相关博客 本文是我总结日常工作中遇到的坑,结合黑泽君相关博客,选取.补充了部分内容. 表的优化 小表join大表.大表join小表 将key相对分散,并且数据量小的表放在join的左边 ...
- Ztree插件,定位节点时(focus)不能进入可视区域BUG解决方案
相关插件版本: jquery.ztree.exedit-3.4.js jquery.ztree.all-3.4.js jquery-1.8.0.js function onAsyncSuccess(e ...
- 修复jquery.treeview的增加子节点的方法的bug
1.修复理由 在一个android项目中用到了treeview控件(本来自己通过android的原生api实现了一个http://www.cnblogs.com/Mr-Nobody/p/3527688 ...
随机推荐
- 修改tomcat的端口
- 利用bootstrap写图片轮播
利用bootstrap写图片轮播 缺点是轮播没有固定样式图片样式会改变外框的大小,所以要再设置 以及左右按钮的style也要从新设置 <div class="carousel slid ...
- 在项目中添加ReactiveCocoa #安装与配置
这是对官方教程的补充 To add RAC to your application: Add the ReactiveCocoa repository as a submodule of your a ...
- 发送短信MFMessageComposeViewController
if([MFMessageComposeViewController canSendText]) { MFMessageComposeViewController * controller = [[M ...
- (转)jQuery EasyUI Tree - TreeGrid动态加载子节点
有时我们已经得到充分的分层树形网格(TreeGrid)的数据. 我们还想让树形网格(TreeGrid)按层次惰性加载节点. 首先,只加载顶层节点. 然后点击节点的展开图标来加载它的子节点. 本教程展示 ...
- 使用 Sandcastle 生成代码帮助文档
使用 Sandcastle可以生成MSDN风格的帮助文档,生成的帮助文档既可以是chm文档,也可以是MS Help 2.x帮助文档. 1 下载并安装Sandcastle Sandcastle下载地址为 ...
- Unity3d 着色器语法(Shader)
Shader "name" { [Properties] Subshaders [Fallback] } 定义了一个着色器.着色器拥有一个 Properties 的列表.着色器包含 ...
- js进阶
js在实例化对象后,可以对这个对象增加属性和属性值,并且还可以通过delete一元操作符来删除对象的属性. var o = new Object(); o.name = "langsin&q ...
- Error:SSL peer shut down incorrectly
从别的地方拷贝过来的项目有时会报这个错误,解决方法 File -> Project Structure -> project 对比本地项目和拷贝项目并修改至与本地项目一致
- ReferenceQueue<T>随笔
参考资料: ReferenceQueue食用手册 java引用食用手册 ReferenceQueue源代码里面很好的展示了java队列的实现思路, 以及多线程观察者的实现思路 多线程观察者实现思路: ...