写入默认 (Write Defaults)
原文章原址出处:https://notes.sleightly.dev/write-defaults/
写入默认 (Write Defaults)
Write Defaults
是Write Defaults动画状态( Animator States)States 中的一个可选项,这对于许多虚拟形象 Avatar 创作者来说都是一个令人头疼的问题,它可能会造成困扰,因为它的其行为表现比较反直觉有时非常奇怪和出乎意料。其预期的行为如下:
Write Defaults
选项决定了通过这个动画中所做的更改是否保持不变。
译者注释:Write Defaults 选项决定了当前播放的动画对物体所做的更改是否在当前动画结束和离开状态后保持久性的不变。
如果启用了 Write Defaults
选项,则模型在离开上一个动画状态后,在当前动画状态绘制前写回上个动画状态中动画属性在离开 Animator 状态时将返回到默认状态。
译者注释:默认状态指的是当 Avatar 在上传时,一个物体所处的状态。比如一个方块在上传时的缩放是 (1 | 1.5 | 2),并且是启用的,那么这个方块的默认状态,不保留上个状态的更改(见示例)就是缩放 (1 | 1.5 | 2) 并且启用。
如果禁用了 Write Defaults
选项,则更改将保持不会写回默认状态变。
译者注释:如果禁用了 Write Defaults 选项,保留上个状态当前播放的动画对物体所做的更改(见示例)将保留下来。
默认情况下,Unity 会在新创建的状态上启用 Write
Defaults,Defaults,但 VRChat 提供的示例动画控制器(默认 Animator Controller)没有启用Controllers 中是关闭 Write Defaults
了 的。
新建状态默认新创建的动画状态为开启用 Write
Defaults。Defaults。
示举例:
如果您有一个你在层级( Hierarchy )中被上传时将帽子禁用(即默认情况下关闭)的帽子(hat),并且您有一个看起来像这样的层级如下所示:
在启用 Write Defaults
的情况下下:
- 当切换到
Hat On
时,帽子会被打开 - 当切换回
Empty State
状态时,帽子会被关闭(因为帽子被写回了默认状态)
在禁用 Write Defaults
的情况下:
- 当
进入切换到Hat On
时,帽子会的状态切换为被打开启状态 - 当
回切换到Hat Off (Empty
时,帽子会State)的状态State切换为关闭状态(因为这是默认状态)
在 Write Defaults Off 的情况下:
当进入 Hat On 的状态时,帽子会切换为开启状态当进入 Hat Off (Empty State)的状态时,帽子将保持开启状态(因为您没有特意动画将其切换回关闭状态或,也没有写回默认值状态)
操作规则使用指南
在使用 Write Defaults Off
时,请遵循以下几条规则。为了规整起见,我将会在下方稍后作出解释原因(仅为完整性起见):
请勿不要在单一个控制器中混合使用Write Defaults。混合使用 Write Defaults
。如此设置的会使其表现将类似于使用得像Write Defaults Off
一样。此条有-
唯一的例外
情况:具是只有单个状态(或包含的动画层。这些层可以使用,并且在 Direct Blend Trees 的单个状态)的层可以被情况下,应该设置为Write Defaults On。
-
这样做没问题是因为只有一个状态,不会受到 Write Defaults On 的影响。
由于上面的层永远不会离开当前状态,所以您可以这样做,我们从不依赖
Write Defaults On行为。-
请勿在包含不要将 Direct Blend Trees
的状态上上使用设置为Write Defaults
Off。Off-
如果
您正在你使用Write Defaults
Off,则您Off,你的所有状态里都应该包含一个填充动画片段 (Animation Clip)或一个 Blend Tree。这个动画片段可以是空的,但通常建议使用绘制了一个不存在的GameObject物体属性,并且持续有至少两帧的(有时候会将这种填充动画片段(偶尔被称为缓冲动画,或bufferBuffer)。clip)。 请注意,使用
Write Defaults Off
绘制变换对 Transform 进行动画处理会覆盖所有其他正在播放的动画控制器中的所有变换动画。化的 Transform。这特别意味着,对于VRChat 的具体例子是:VRChat,如果您正你在绘制FX层Layer 中的用动画控制任何变换,Transform,它将覆盖 Gesture层layer 中的所有变换,Transform,除非您应用你设置一个仅Avatar Mask,只启用变换被动画控制的 Transforms 并禁用所有其他变换的人形遮罩(AvatarMasks),Transforms,并将此这个遮罩应用到您你的 FX层Layer 动画层。
有关遮罩 Avatar Mask 的更多信息,请参阅“见 Avatar Masks” 页面。
请注意:如果您因你由于 WD Off Transform 的动画而必须在 Gesture 和 FX 层中的使用 WriteAvatar Defaults Off 变换Mask,你只能用动画而必须使用遮罩,则不能在除修改第一个材质插槽之外球而不能修改其他的任何插槽上使用材质切换动画,因为无论遮罩是否启用,被遮罩的变换( Transform(无论在有 Avatar Mask 的情况下 WD 是启用还是禁用)都不能在用动画修改除了第一个材质插槽之外的其他材质插槽上具有材质切换动画球。
VRLabs 的 Avatar 3.0 Manager 是用于可以帮助你检查您你是否违背反了以上规则的实用工具(检测至少前两能检查第一条规则和第三条) 。在该工具的 Write Defaults
选项卡中,它会告诉您你是否混合使用了 Write
Defaults,Defaults,并会在您按下相应按钮时为您自动帮助你统一设置。请注意,它不会在设置过程中特意排除把 Direct Blend Trees,因此包含它们的动画状态必须在其名称中包含(WDTrees On)字段当作例外,所以使该工具将其标记任何刻意设置为 Write Defaults On
。 的状态都必须在状态名称中添加 (WD On) 来标记为启用 Write Defaults。
上述规则的解释
不要在单一个控制器中混合使用 Write Defaults
处于播放单个 Write Defaults Off
的状态时,这将会导致所有其他 Write Defaults On
的状态不无法写回入其默认值,并从而使其表现为得像 Write Defaults Off
状态 一样。
不要在 Direct Blend Trees 中使用 Write Defaults Off
Write Defaults Off
的 Direct Blend Trees 会出现一些产生奇怪的行为,例比如影响其他在使用相同参数的其他 Direct Blend Trees,并且还会随着时间的推移将,动画结果会乘以它们的一个因子,使得最终结果变得非常奇怪。一般来说,导致意外结果的发生。您通常不应永远不该这么做。
为了更清楚地说明这种乘法行为,此处列出最终对结果:来说,在禁用 Write Defaults
Off 的 Direct Blend TreesTree 中,最终的权重会乘以被一个因子 x/(1-yx)
的因子所乘,其中 x 是当前子级项的权重,y 是其他子级项的权重之和,除以当前子级项的权重。请注意,如果这个分数的分母为 0 或更低小,则数值变为会趋向于无穷大且永远并不会停止断增加。这意味着,如果您你有 n 个子级项,并且将每个子级项的权重设置为 1/n,则那么最终结果是乘数为 1 ,1,因此这允许您你使用禁用 Write Defaults
的 Direct Blend Trees。然而,这并不意味着这 Off样是个值得推荐的做就是明智的。法,因此由于为这会影响其他混合树 Blend Trees 和表现出导致其他奇怪的行为,您可以使结果。启用 Write Defaults
On ,它会更为简单。
如果您正在你使用 Write Defaults
Off,则您的Off,所有状态都应该包含一个动画切片或一个 Blend Tree。Tree
不包含任何动画片段的如果一个 Write Defaults Off
的状态将没有包含动画,它可能会使用上一个之前动画层中的状态中的动画片段的属性默认值,覆写上方图盖之前层中的动画片段。
优点/缺点
Write Default On
优点::
由于更加简单,因为可以使用空动画状态/(或Bufferbuffer clip) 来恢复状态,这会让物体回到上传时模型的初始状态,因此使用稍简单些。允许在不覆盖 Gesture 层动画内容的情况下在 FX 层上使用变换Transform 动画,且不会将动画覆写到 Gesture 层。- 在基
础本的双2 状态开关切换中,相对比于Write Defaults
Off的帧时间((仅在 Unity2019中)2019)。 更容易可以轻松地修改更改默认值(状态(如果您你依赖于上传时的默认状态)的话)。
译者注释:另一种确定默认状态的方法是在之前的动画层中用动画锁定一个默认状态。
缺点:
- 依赖上传时的状态
通常在混合使用Write Defaults
时通常会出现问题不允许在不使用 ParameterDriversDriver 或者 AAP 的情况下进行顺无法使用序迭代列操作
译者注释:序列操作指的是将一段复杂的动画拆解成多个动画依次执行,这样将极大地减轻单个动画的复杂度以及减少维护和修改的难度。例如,将一扇有门把手的门打开再关上可以拆解成四个部分:1. 把手下压 2. 门打开 3. 把手松开 4. 门关上。
Write Default Off
优点:
- 不依赖于上传时的状态
- 通常
与可以混合使用Write Defaults
兼容且不会有问题 允许顺可以使用序迭代列操作
缺点:
- 在空状态中需要
缓冲有填充动画 - 在没有遮罩的情况下
对变换进行用动画处理修改对 Transform 时,会覆盖 Gesture 层的所有手势变换Transform。 - 在基
础本的双2 状态开关切换中,相对比于Write
DefaultsDefaultOn的帧时间((仅在 Unity2019中)2019)。
创作者指南
当这些指南适用于创建应与同时兼容 Write Defaults On
和 Write Defaults Off
兼容的预制件时,这些指南将非常有用:
请确保每个图动画层中都包含只对一组其专有,不同于其他图层所拥有的属性进行动画属性(例如,图层中的每个状态都应动画化对相同的一组属性进行动画)。- 如果需要在多个
图层上动画化中对同一属性进行动画,请确保每个状态中都包含一个有动画片段,且并注意较低图层会覆写盖较高图层,并始终在顶部提供保留一个具有Reset 层作为默认状态的“重置”图层。
如果您遵循本文档中概述的指南,每个属性都将始终会被动画化,并且您你的动画系统将始终与可以兼容 Write Defaults On
和 Write Defaults
Off一起正常工作。Off。
Blendshape 值翻三倍
在非常特定的条件下,使用当依赖于 Write Defaults On
时,Blendshape 的值会翻增加三倍。
(例如:您你有一个空的 Write Defaults On
状态,它会过渡到一个绘制 Blendshape 动画的 Write Defaults On
状态。过渡到在空的 Write Defaults On
状态时中,之前被动画化的 Blendshape 的默认值会被乘以 3 。3。)
这个问题比其他问题更加微妙复杂和模糊不明确,所因此请将本文和以请勿把这里的描述当作事实,而更多地当作我的下内容视为观察结果,而非事实:
它这个问题似乎是由使用Additive 动画层的 Write Defaults Off
的 Additive layer引起的。它被如果有一个只有仅包含Write Defaults Off
状态(如 VRC 提供的默认状态动画器)的手势Gesture 动画层所阻止,这个现象就不会发生。但如果有一个正在播放一个使用的Write Defaults On
的状态,问题会导致它再次发生出现。它这个问题与任何遮罩Avatar Mask 和动画是否实际可过渡达到的动画都无关。,只需要它们存在于图动画层上就足够了会引发问题。- 如果只
要您使用 0或和 100 的值,就它不会发生这个问题影响行为,因为0 乘0.3=0且和100 乘100.3=100 (100(这是由于 Blendshape钳制导致的,您Camping,你可以在你的 Unity 编辑器中启用这一选项目中通过转到,方法是前往 Project Settings → Player → Other Settings → ClampBlendshapes (Deprecated) 来启Blendshapes(已弃用它)。这个功能在VRChat中已被启用了此选项)。) 修复此解决这个问题的正确方法是有一个动画始终明确设置地对 Blendshape 值进行动画处理。糊弄式修复此问题一种快捷且不太完善的解决方法是设置将空闲图层中的状态设置为Write Defaults
On。On。