BlendSpace对于非Loop动画能否支持同步组

对于角色的起步动画(我们使用的RootMotionForEverything),我们分为了三个不同速率的三个起步方式,在起步途中可能会发生起步方式的变化(walk​:right_arrow:run),因此想用BlendSpace来保证发生动画切换时的相位一致,不会出现重新起步。同时衔接到Loop时会使用同步组来衔接到Loop动画。但是发现在启用同步组后,BlendSpace的逻辑总是会在切换时经过下述步骤让混入的动画播放时间从0开始。

  • UAnimSequence::GetMarkerIndicesForPosition针对非Loop动画会将PrevMarker设为INDEX_NONE
  • 后续的步骤均认为PrevMarker设为INDEX_NONE是有效的,因此混入动画会从0开始。

请问下BlendSpace能否支持非Loop动画使用同步组,或者有其他方式保证相位一致的同时且能使用同步组吗?

<br/>

[Attachment Removed]

你好,想确认一下,

是整个起步过程在一个BlendSpace里面吗?这个BlendSpace内包含了Walk和Run?你说的Walk->Run的切换也是在这个BlendSpace内吗?

出现问题的时候是在这个BlendSpace切换到Loop的过程中?切换的过程中PrevMarker会被设为INDEX_NONE?

请问我这些描述是对的吗?文字描述起来不是很好理解,若是方便的话可以提供一个最简单的问题演示工程吗?

[Attachment Removed]

使用的版本是UE5.6.1, 如示例所示,只简单处理了起步,在0.4s时从walk切换到jog时动画会重新开始触发。

[Attachment Removed]

你好,抱歉回复晚了,感谢你的工程,我明白你的问题了。

但比较遗憾,目前的BlendSpace逻辑来看确实不支持非Loop动画切换后相位对齐,同步组在这里看上去起不到理想的作用,由于是非Loop的,SyncMark也没什么用。

根据我之前的经验,像你们这种偏写实的单机游戏,不太建议用BlendSpace来做起步过程种的切换,因为动画师会认为,只要用BlendSpace进行了混合,动画会因为混合造成表现的流失。

我们之前的做法是,所有的Start动画还是拆分出来的,在Start的过程种,若是发生了步态的切换,会在过渡的时候做一帧PoseSearch,找到目标动画Pose最匹配的那帧,再从那帧开始播放,这样姿态和相位应该差不太多,过度不会太硬。

另外,你之前说“归一化时间的百分比”也能达到相位一致的效果,也可以按这个思路,利用SequenceEvaluator的特性,在切出的时候记下百分比,然后再切进的时候将这个记下的百分比应用到目标动画的开始时间。

仅供参考,若是有什么想法可以继续讨论。

[Attachment Removed]

是的,是一维的BlendSpace,横坐标方向包括Walk_Start,Jog_Start,Run_Start三个向前起步动画(非Loop动画且时长不一样)。

在没使用同步组的情况下,因为混合空间的归一化时间能够保证在动画切换时保证相位一致(比如Walk_Start切换到Jog_Start时能够保证两段动画运行的时间百分比是一样的)。

但是开启了同步组后,同样的动画切换情境下Jog_Start会从第一帧重新开始(也就是上面说的PrevMarker会被设为INDEX_NONE后触发的逻辑)。

请问下能否理解上诉情况?有需要的话我尝试用Lyra工程还原一下。

[Attachment Removed]

抱歉,我好像还是有点迷糊

意思是在BlendSpace中,Walk_Start切换到Jog_Start这个过程中,开启了同步组后,Jog_Start表现异常,会从第一帧开始?是这样吗?

若是方便的话,还是用Lyra或者第三人称默认工程帮忙重现一下吧。

[Attachment Removed]

好的,感谢回复。从逻辑上说这两个方法可以保证开始混合时的百分比一致,但混合过程中会出现相位差异(或者动态的修改playrate),不过最终的动画表现应该差异不大,我会尝试这两个方案。

[Attachment Removed]