在Blend Space的源码里看到了这个东西,不太清楚是干啥的。
参考链接:https://www.youtube.com/watch?v=lWRsPl_IX7c&ab_channel=MattCourtois
看了下,Sync Group可以帮助更好的进行动画之间的过渡,它需要两步操作:
第一步,为动画添加Sync Marker
打开Anim Sequence,选择对应的帧,右键new Sync Marker就可以了,如下图所示,是这个作者为这个奔跑动画添加的两个Marker:

用类似的方法,作者接着为其他的走路的动画,也添加了的左右脚落地时候的Sync Marker,比如蹲着走的动画,比如从静止到起跑的过渡动画。
第二步,创建Sync Groups
由于这些动画里的Sync Markers都是走路的左右脚的Marker,为了让其生效,需要创建Sync Groups,具体的方法是在AnimGraph里,选中每个前面编辑过的动画Clip对应的节点,在Details里,为其选择Sync Groups,注意它们的名字需要是相同的,如下图所示:

上述操作能让角色的脚步更自然,假设没有使用Sync Marker,对于人物起跑时,他会从Idle,开始播放Idle To Run这个过渡动画A,然后从A动画过渡到循环播放的跑步动画B,如下图所示是A和B动画的播放情况,三角形代表左右脚落地的时间位置

A到B这个过渡的时间是由User指定的,假设User指定为0.2s,那么二者的混合可能如下图所示,在红色点处,二者开始混合:

很明显此时有个问题,就是A动画在红色位置的状态是两脚腾空的,而B动画是左脚落地的,所以此时播放的动画会显得人物的左脚在被往下拽,播放起来很不自然。
但是如果有了Sync Marker和Sync Group,那么UE4会去判断,他会根据这个红色的位置,得到红色点在A动画里的LS和RS里所在的比例值,从而算出它在B动画里对应的位置,然后此时的B动画不会从LS处开始Blend,而是从计算得到的F点的位置开始Blend,如下图所示:

这样正好能保证,开始过渡Blend的时候,二者都是处于相同的状态。然后我猜这0.2s的时间里,最后的A的结尾,应该也会和B动画的结尾的比例去匹配一下。也就是说,过渡的开始,需要满足两个动画都在Marker之间相同的比例位置,在过渡的结束,也要满足同样的条件。
下面过一下UE4的官方文档:https://docs.unrealengine.com/4.27/en-US/AnimatingObjects/SkeletalMeshAnimation/SyncGroups/
Sync Groups allow you to maintain the synchronization of animations of different lengths.
Sync Groups的核心理念是解决不同长度的动画的同步问题,上文已经给过一个例子,这里再举一个,比如说有一个Run和Walk动画,一般Walk的动画长度会比Run动画长一些,此时如果直接按照对应的时间进行Blend,效果是不对的(不能用normalized time进行blend么?)
Sync Group会指定其中一个主要的动画节点,把它叫做Leader,根据Leader的动画时长,改变其他所有相关的动画时长。一般会选用权重最大的节点作为Leader,随着时间改变,如果哪个节点权重变为最大,那么它会变成新的Leader。对应一些动画的Blend,还要做额外的处理,比如说Walk和Run动画的起始抬脚要一致等。
Sync Groups可以作用于动画节点,有这些:
Sync Groups works with the concept of group roles,就是各个节点代表的角色,这里应该就俩角色:Leader和Follwers。
Leader的特点:
Followers的特点:
前面提到过,AnimGraph里选中对应的动画节点,Details里可以输入Group Name,这里还可以选择Group Role:

Group Role,可以选择:
在Animation Sequence里的Animation Notifications栏里金额已添加Sync Marker,相当于手动添加标记,让动画同步,如下图所示:

使用Sync Marker的时候,有以下规则:
想到的问题,Sync Marker是不是最少俩?能不能只有一个?
参考:https://docs.unrealengine.com/5.0/en-US/animation-sync-groups-in-unreal-engine/
看了下,UE5的Sync Groups好像加了一些东西,所以这里把它的文档也过一下。
Sync Groups的概念还是一样的,同一个Group里的动画分为Leader和Followers,Leader作为动画的播放主线,Followers根据Marker于Leader同步,Leader可以优先触发Animation Notifies(Leaders provide the master animation length that is used by all followers and have priority for triggering Animation Notifies)。Followers match their animation lengths to leaders and have their notifies suppressed. Followers好像不会接受对应的notifes?如果多个动画进行Blend,那么默认是谁权重高,谁就是Leader,所以Leader是动态变化的
在动画蓝图里,点击节点对应Details Panel会出现相关设置,如下图所示:

Group Name
同一组的动画,Group Name应该相同
Group Role
Group Role可以添加对Leader的设置,一共有如下几种,应该是在动画文件上设置:
Method
有三种选择:
做法很简单,只要选中多个动画节点,要输入个String作为Group Name即可,不过这种方法没有老的Sync Maker,应该只是单纯的同步每个动画的时长而已:

使用Sync Group现在会在节点上显示出来,如下图所示:

感觉跟文章前面讲的UE4的Sync Group是一样的,这里的动画节点的Group Name要一样,同时节点里都添加了相同名字的Sync Maker。
一般用于:
在动画资源,比如Anim Sequence上设置的Sync Maker,数据会保存到对应的Skeleton上。这样相同模型的动画就不要每次都new sync maker了,如下所示:

Graph-based Syncing可以让整个图,或者Tree,里的节点都加入到一个GraphGroup里,需要做两步:
所有Sync的节点类型变为,Graph-based,如下图所示:

创建Sync Node,连到这个子树的Output上,如下图所示:

Typically, you may want to place this node after your pose logic, so that it can synchronize all incoming animation data.
还有种特殊的Graph-based group,就是Blend Space,此时的Sync会应用到所有的Sample上。操作是一样的,选中BlendSpace节点,设置Group Name:

此时,Sample里对应的动画节点会随着设置为Graph类型:
