人形遮罩 (Avatar Mask)
原始页面:https://notes.sleightly.dev/animator-masks/
Unity 行为
Avatar Mask 会基于在遮罩中启用和禁用的选项,阻止或允许 Humanoid Muscle 数值、材质球替换和 Transform 的动画处理。如果一个动画层具有一个启用了特定值的 Avatar Mask,那么该层的动画可以对该值进行动画处理。如果一个动画层具有一个禁用了特定值的 Avatar Mask,那么该层的动画则不能对该值进行动画处理。具体而言:
- 如果一个动画层具有启用了 Humanoid Muscle 数值(例如左手)的 Avatar Mask,那么该层中的动画可以修改该 Humanoid Muscle 数值。
- 如果一个动画层具有禁用了 Humanoid Muscle 数值(例如左手)的 Avatar Mask,那么该层中的动画不能修改该 Humanoid Muscle 数值。
- 如果一个动画层具有启用了或未指定的 Transform 的 Avatar Mask,那么该 Transform 可以通过该层的动画修改其位置、旋转和缩放,以及对第一个材质球进行替换。
- 果一个动画层具有禁用了 Transform 的 Avatar Mask,那么该 Transform 的位置、旋转或缩放,以及第一个材质球的替换,都不能通过该层的动画进行修改。
- 如果一个动画层有任何 Avatar Mask,它不能对任何材质球的替换(除了第一个材质球)或 Animator 上的根 Transform 进行动画处理。
其他内容(如 blendshapes 和任何其他组件)不会受到 Avatar Mask 的影响。
设置 Avatar Mask 的原因在于,如果你在一个层中对一个 Humanoid Muscle 数值进行动画处理,然后在另一个层中对同一个 Humanoid Muscle 数值进行动画处理(无论是在 Animator 中的更低层还是在不同的可播放层中),前者的动画会被后者覆盖(除非另一个层是 Additive 层,在这种情况下,它会叠加在前者之上)。
对于 Transform,这种情况仅在第二个动画使用 WD off 并且位于一个稍后应用的 Playable Layer 时发生。
例如,如果没有 Avatar Mask,如果你在 Gesture Layer 中为手部动作做了动画处理,而在 FX Layer 中使用了不同的动画处理面部表情(同时也处理了 Humanoid Muscle),那么手部的值将被 FX Layer 覆盖。
注意:这意味着,如果你有一个 Humanoid 动画,没有进行适当的 Avatar Mask 以启用所需的 Humanoid Muscle 数值并禁用其他数值,所有其他 Humanoid Muscle 数值将会被覆盖。
这也意味着,如果你在 Gesture Layer 中有 Transform 动画,而在 FX Layer 中有一个未进行 Avatar Mask 的 WD Off Transform 动画,所有 Gesture Layer 中的 Transform 动画将会被覆盖。
默认的 VRChat FX Layer 使用了未进行 Avatar Mask 的 WD off 混合树。这可能导致在 VRChat 中 Transform 动画无法播放,只要你使用默认的 FX Layer。如果你想在 Gesture Layer 中进行 Transform 动画,你必须使用你自己的 FX Layer 或者移除默认的 FX Layer 并将其设置为空。
VRChat 层行为
所有 Playable Layers 会依次播放。首先是 Base 层,然后是 Additive 层,接着是 Gesture 层,然后是 Action 层,最后是 FX 层。
在前四个层(Base、Additive、Gesture 和 Action)中,你应该只使用影响 Transform(无论是 Humanoid Muscle 还是 Transform 动画)和开关 GameObject 的动画。
这不是因为 Avatar Mask,而是因为这四个层只在你的本地 Avatar 克隆体上播放,而不会在你的镜像和阴影克隆体上播放。VRChat 复制本地 Avatar 上每个 GameObject 的 Transform 和开关状态,并将它们应用到 Avatar 的镜像和阴影克隆体上。然而,VRChat 不会复制除了 Transform 和每个 GameObject 的开关状态之外的任何内容,这意味着如果你动画处理了其他内容,如 blendshapes、材质球替换或着色器设置,VRChat 不会将这些属性复制到镜像和阴影克隆体。克隆体会播放自己的 FX Layer,这就是为什么除了 Transform 和 GameObject 的开关状态之外的内容应该在 FX Layer 中进行动画处理的原因。
例如:如果你在 Base Layer 中进行材质球替换,它不会在镜像和阴影克隆体上生效。
本文仅详细讨论了 Avatar Mask 和行为。如果你想了解更多关于 VRChat 层的内容或 VRChat 推荐的层使用方法,你可以在以下页面找到更多信息:
Playable Layers | VRChat Creation
基本动画层
Base
Base 该层应仅动画处理 Transform(无论是直接还是通过 Humanoid Muscle)和/或 GameObject 的开关状态。
VRChat 推荐将此层用于运动,并仅动画处理 Humanoid Muscle。
Additive
Additive 该层应仅动画处理 Transform 和/或 GameObject 的开关状态。它是以叠加混合的方式进行的,这意味着任何动画不会替换基础层的动画,而是将值叠加。
VRChat 推荐将此层用于运动的调整,如呼吸效果,并仅动画处理 Humanoid Muscle。
Gesture
该层应仅动画处理 Transform 和/或 GameObject 的开关状态。它有一些特殊的行为,即 VRChat 会将第一层的 Avatar Mask 应用到所有层上,如果在这个 Avatar Mask 或层的 Avatar Mask 中禁用了动画(无论是 Humanoid 还是 Transform),它会被禁用。
因此,如果你想动画处理任何 Humanoid Muscle,你必须制作一个专门允许这些肌肉的 Avatar Mask 并将其放在顶部层中。
如果你想动画处理任何带有 WD Off 的 Transform,你必须制作一个专门允许这些 Transform 并禁用其他的 Avatar Mask,并将其放在顶部层中。
VRChat 推荐将此层用于动画处理 Transform 和仅影响特定身体部位的 Humanoid 动画。
Action
该层应仅动画处理 Transform 和/或 GameObject 的开关状态。该层默认情况下的权重为零。在你在 Action 层中进行任何操作之前,你需要使用 Playable Layer Control State Behavior 将该层混合到一个值,然后再过渡到你要执行的实际操作。当你完成后,确保将其混合回零,否则其他动画将全部被覆盖。
VRChat 推荐将此层用于覆盖前面层中的任何 Humanoid 动画,例如表情或 AFK 动画。
FX
由于该层在所有克隆体上运行,因此这是你可以运行任何动画的地方。请注意,您仍然可以对 Transform 进行动画处理,只要有适当的 Avatar Mask。
如果第一层 Avatar Mask 为空,它将创建一个默认的 Avatar Mask,禁用所有 Humanoid Muscle 数值并启用所有 Transform,并将其应用到所有层上,使其在这个 Avatar Mask 或层的 Avatar Mask 中禁用的内容会被禁用。
如果第一层 Avatar Mask 不为空,它将采用第一层 Avatar Mask,并以相同的方式应用到所有层。
因此,如果你想动画处理任何 Humanoid Muscle,你必须制作一个专门允许这些肌肉并关闭肌肉的 Avatar Mask 并将其放在最顶层。如果你不关闭,它们将会覆盖 Gesture 动画中的内容。
如果你使用 WD off,同样的逻辑也适用于 Transform。
VRC 的默认 FX 层有一个混合树,写入默认值为关闭,这可能会破坏 Transform 动画。如果你想在任何层上使用 Transform 动画,请不要使用默认的 VRC FX 层。
VRChat 推荐将此层用于所有非 Transform 动画的内容,例如启用/禁用 GameObjects、组件、材质球替换、着色器动画、粒子系统动画等。
特殊层
T-pose:
T-Pose 用于确定 Avatar 的各种测量值,特别是视点(或视角球)的放置。它独立播放,因此 Avatar Mask 并不重要。
IK Pose:
IK Pose 用于确定主要关节的弯曲。在 IK 姿势中,你的关节应该略微弯曲,以符合其弯曲方向。它独立播放,因此 Avatar Mask 并不重要。
Sitting Pose:
这个控制器用于动画和姿势。当你坐下时,Avatar 的视点会用于校准。动画播放后,你可以创建一个“坐下”动画以及一个“坐着”的闲置动画。它像 Action 层一样使用,会覆盖所有的 Humanoid 动画,以使角色坐下。