序列栈叠层系统

序列栈叠层系统,指在不同的情况下(由GameplayTags驱动),采用不同的动画序列与基础运动进行动态混合,通过混合遮罩/BranchFilters来控制混合的权重。

Cover.GMS
罗传月武(YueWu)

作者

罗传月武(YueWu)

专注游戏开发和Web技术。

创建时间: 2025年10月15日更新时间: 2026年9月15日

目录

概述

序列栈叠层系统,指在不同的情况下(由GameplayTags驱动),采用不同的动画序列与基础运动进行动态混合,通过混合遮罩/BranchFilters来控制混合的权重。

并行序列栈

要使用并行序列栈,在运动集设置的Anim Layer Setting(Overlay)字段选择ParallelSequenceStack。

并行序列栈.选择

它的基本配置结构如下:

并行序列栈.数据结构

在这里,你可以配置多个叠加模式设置,每一个叠加模式设置允许你配置:

  • 模式标识:使用GMS.OverlayMode.XXX标签对该叠加模式设置进行唯一标识。
  • 并行序列栈(Stacks):最多可添加10个栈。优先级由元素下标决定(下标越大,优先级越高)。

单栈配置

每一个栈可以代表一个身体部位,可配置:

  • TargetAnimNodes:决定潜在动画序列会在哪些动画节点对应的Tags激活时播放,相当于开关,如果动画蓝图播放到指定的动画状态节点,那么才会考虑此栈中配置的动画。
  • 潜在的动画列表(Overlays):该部位会播放的潜在动画列表。
并行序列栈.单个Stack

潜在动画列表

而Overlays是一个数组,其中每一项主要用于控制:

并行序列栈.单个Entry

Tag查询(TagQuery):针对运动系统组件所拥有标签的查询,此动画序列会在标签匹配此查询时被考虑。
播放模式(PlayMode):控制序列的播放模式,可以是循环动画(SequencePlayer),也可以是播放序列的单帧单(SequenceEvaluator)。

混合权重(BlendWeight):以及动作的混入时间。

混合模式(BlendMode):混合的模式可以是指定存在于骨架上的BlendMask名称,也可以是BranchFilters。查看LayeredBlendPerbone以了解基础。

案例

这是并行序列栈的叠层系统的案例,取自配套项目中的SequenceStack_Demo_P叠层设置。

常规用法:

下图是以MovementSet.Unarmed(Lyra的Unarmed的Locomotion)为基础,并以Paragon的Greystone的动作来混合出的剑/盾动作。

并行序列栈.剑案例

其中第一个栈是在非待机状态下,在角色的上半身播放剑/盾的移动动作。

并行序列栈.剑案例.栈1

第二个栈则是在待机状态下,在角色的上半身播放剑/盾的待机动作。

并行序列栈.剑案例.栈2

在叠层设置为OverlayMode.Sword的情况下,效果如下:

动态选择用法:

再看案例2,这次不仅利用TargetAnimNodes,还利用到了TagQuery。

下图配置在了在地面情况下,满足条件时,在不同部位播放不同的动作混合。

并行序列栈.案例

第一个栈是默认情况下(无条件),在角色上半身播放Dance动画。

GMS动画叠层系统.006

第二个栈则是在Injured状态下,在角色的左手部位播放Injured动画。

GMS动画叠层系统.007

第三个栈则是在HandTied状态下,在角色的上半身播放手被捆绑的动画。

GMS动画叠层系统.007.5

我通过在关卡中设置了两个触发器,分别为角色添加10秒的Injured状态和5秒的HandTied状态。

GMS动画叠层系统.008

在叠层设置为OverlayMode.Demo的情况下,效果如下:

你可以看到,如果同时有Injured和HandTied状态,会优先播放HandTied(因为它是Stacks中优先级最高的),当HandTied状态消失后,又会回到Injured的状态,当Injured状态小时候,则回到上半身跳舞的动作。

视频参考

视频教程中的个别参数名称已经过时,但可以看一下流程。

Video

序列栈

序列栈是并行序列栈的简化版,提供更好的性能,但不支持同时在多个身体部位播放不同的序列。

我发现并行序列栈过于复杂,因此开发了此版本。

要使用序列栈,在运动集设置的Overlay Anim Layer部分,选择SequenceStack。

序列栈.选择

在这里,你可以配置多个叠加模式设置,每一个叠加模式设置允许你配置:

  • 模式标识:使用GMS.OverlayMode.XXX标签对该叠加模式设置进行唯一标识。
  • 序列列表:即潜在的动态序列设置(SeqeucenStackEntry),选择的优先级按照数组下标顺序进行选择,越往后,优先级越低。

每一个动态序列设置含如下设置:

序列栈.Sequence设置

其中最重要的是:

RelevanceQuery:激活的动画节点满足此查询会被选择。

TagQuery:角色的Tags满足此查询会被选择。