姿势栈叠层系统

姿势栈叠层系统,指在不同的情况下,采用不同姿态的单帧Pose与基础运动进行动态混合,同时通过身体部位权重设置来控制动画混合的权重。

Cover.GMS
作

作者

作者

创建时间: 2025年4月21日更新时间: 2026年4月14日

目录

概述

姿势栈叠层系统,指在不同的情况下,采用不同姿态的单帧Pose与基础运动进行动态混合,同时通过身体部位权重设置来控制动画混合的权重。

如果你使用过ALS(Advanced Locomotion System),你应该对此很熟悉。但在GMS中,对这一项功能进行了大幅改进。

姿势栈

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

姿势栈.选择

它的基本配置结构如下:

姿势栈.数据结构

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

  • 模式标识:使用GMS.OverlayMode.XXX标签对该叠加模式设置进行唯一标识。
  • 基础姿势:该姿势与基础运动进行姿势相减,从而构成动态附加姿势。
  • 潜在动态姿势:可配置一组潜在的动态姿势(PoseStackEntry)。会按从上往下的优先级进行选择。

单姿势配置

每一个动态姿势可配置:

  • 相关性查询(RelevanceQuery):针对主动画实例的相关性标签的查询,相关性标签指:用于标识动画状态机节点是否激活的标签。此姿势会在标签匹配此查询时被考虑。
  • 标签查询(TagQuery):针对运动系统组件所拥有标签的查询。此姿势会在标签匹配此查询时被考虑。
  • 姿势(Pose):此姿势的动画序列。
  • 姿势混合(PoseBlend):控制每一个身体部位的混合权重,每一个混合字段在编辑器中都有详细的注释。
  • 指定时间(ExplicitTime):若序列包含多帧,此值控制到底播放哪一帧。
  • 上下扫描姿势:若该姿势用于瞄准时,那么还可以指定一个上下瞄准的姿势(左右瞄准由默认的ViewLayer通过旋转脊椎骨实现)。
序列栈.Pose设置

技巧

为了更好的混合效果,尽量使用单帧序列,而不是多帧序列,然后用时间来区分。切换多帧序列时只是时间轴跳转,不如两个序列交替的效果好。

案例

这是序列栈的叠层系统的案例,取自配套项目中的MS_Mannequin_PoseStack_Lyra,该运动定义具备默认,瞄准,蹲伏,蹲伏瞄准4个运动集设置,其中每个运动集的状态动画层(基础运动)采用的是Lyra中的徒手动画包配置。

弓叠层

在该运动定义的默认运动集中,对OverlayMode.Bow进行了如下设置:

序列栈.弓案例.1

注意,一共两个姿势,第一个姿势的相关性查询中指定了Idle,意味着待机时播放第一个姿势,第一个姿势不满足条件时(即非待机时),就会播放第二个移动姿势。

你只通过2个单帧动画就实现了这个效果,而不需要一整个动画包!

举一反三

由于不同的运动集可以配置不同的叠加系统,意味着你可以在瞄准,蹲伏等其它运动集设置中配置不同的姿势栈,组合出更加多样的行为。

下面是我在不同的运动集设置中的相同“Demo”叠层中分别配置了不同的姿势栈,可以实现非常多样的结果。

序列栈.混合案例.1

这是Demo叠层的最终效果(在不同的状态,混合的姿势完全不一样):

不仅如此

你还可以在不同的运动集设置之间,选择不同的叠加层实现,比如默认运动集使用“PoseStack”,蹲伏运动集使用“SequenceStack”。GMS真的非常灵活!

条件性选择

前面仅利用了相关性查询让姿势在不同的状态机节点激活时播放,你还可以利用标签查询,从而实现更复杂的动态姿势选择。

下图是在前面的默认运动集的PoseStack中,插入了一个优先级最高的Injured姿势,且该姿势只有在角色具备Injured标签时才会播放,同时确保左手姿势不受下层的基础运动影响。

序列栈.条件性案例.1

结果如下(注意,蓝色盒子会给予角色5秒的Injured状态,状态给予那一刻受伤姿势自然混入,状态结束后受伤姿势自然混出。):

并行姿势栈

与姿势栈类似,但该实现允许你同时在身体的不同部位播放不同的Pose,并按照Head->Arm->UpperBody->FullBody的顺序进行姿势覆盖。

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

并行姿势栈.选择

它的基本配置结构如下:

并行姿势栈.数据结构

其中,每一个身体部位你都可以配置一堆潜在姿势进行条件性选择!

案例

下图配置了在上半身播放一个搬箱子的姿势,但是受伤后,会在左臂部分播放一个受伤抚摸着肚皮的姿势,上半身其余部分依然在播放搬箱子的姿势。

并行姿势栈.案例1

效果如下(注意,搬箱子仅采用上半身的叠层):你可以看到,受伤时,右手仍在搬箱子。

姿势曲线设置

GMS1.5及以上版本,姿势不需要通过曲线来配置,而是通过在数据资产中配置,这能提升性能,并进一步提升灵活度(同一帧姿势,在不同的运动集,叠加模式中,其混合权重不一样)。

GMS提供一个动画修改器:AM_CreateLayeringCurves帮助你快速创建动画曲线。

曲线说明:

GMS动画叠层系统.010

非Additive的曲线:

决定该部位的Pose的采用程度(开关,比如LayerArmLeft=0就完全不用左臂的Pose,LayerArmLeft=1就是完全采用左臂的Pose)。

带Additive的曲线:

决定当前的Locomotion在叠了一层Pose后的保留程度(LayerArmLeftAdditive=0表示Pose完全覆盖了左手动作,LayerArmLeftAdditive=0.5表示Locomotion还会保留一半)。

视频教程

你也可以查看此视频得知我是如何从头创建新的叠层模式的(从3.05分开始观看)。该视频已经过时,但可以看看旧版本用法,与新版本进行比较。

Video