Skip to main content

写入默认 (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 DefaultsDefaults,但 VRChat 提供的示例动画控制器(默认 Animator Controller)没有启用Controllers 中是关闭 Write Defaults 的

Untitled.png

新建状态默认新创建的动画状态为开 Write DefaultsDefaults。

例:

如果您有一个层级( Hierarchy )中被上传时将帽子禁用(即默认情况下关闭)的帽子(hat)并且您有一个看起来像这样的层级如下所示

Untitled.png

启用 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 OffOff。

  • 如果您正在使用 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 并禁用所有其他变换的人形遮罩(Avatar Masks),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 DefaultsDefaults,会在您按下相应按钮时为您自动帮助你统一设置。请注意,它不会在设置过程中特意排除 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 Off 的 Direct Blend Trees。然而,这并不意味着这是个值得推荐的就是明智的。法,此由于这会影响其他混合树 Blend Trees 表现出导致其他奇怪的行为,您可以使结果。启Write Defaults On ,它简单。

如果您正在使用 Write Defaults Off,则您的Off,所有状态都应包含一个动画切片一个 Blend Tree。Tree

不包含任何动画片段的如果一个 Write Defaults Off 的状态没有包含动画,它可能使上一个之前动画层中的状态动画片段的属性默认值写上方图盖之前层中的动画片段

优点/缺点

Write Default On

优点:

  • 由于更加简单,因为可以使用空动画状态/ (或Buffer buffer clip) 来恢复状态,这会让物体回到上传时模型的初始状态,因此使用稍简单些
  • 允许在不覆盖 Gesture 层动画内容的情况下在 FX 层使用变换 Transform 动画,且不会将动画覆写到 Gesture 层
  • 在基 2 状态开关切换中,相比于 Write Defaults Off Off,帧时间减少了 33%的帧时间((仅 Unity 2019中)2019)。
  • 更容易可以轻松地修改更改默认值(状态(如果依赖上传时的默认状态)的话)。

译者注释:另一种确定默认状态的方法是在之前的动画层中用动画锁定一个默认状态。

缺点:

  • 依赖上传时状态
  • 通常在混合使用 Write Defaults通常会出现问题
  • 不允许在不使用 Parameter DriversDriver AAP 的情况下进行顺无法使用迭代操作

译者注释:序列操作指的是将一段复杂的动画拆解成多个动画依次执行,这样将极大地减轻单个动画的复杂度以及减少维护和修改的难度。例如,将一扇有门把手的门打开再关上可以拆解成四个部分:1. 把手下压 2. 门打开 3. 把手松开 4. 门关上。

Write Default Off

优点:

  • 不依赖于上传时状态
  • 通常可以混合使用 Write Defaults 兼容且不会有问题
  • 允许顺可以使用迭代操作

缺点:

  • 在空状态中需要缓冲有填充动画
  • 在没有遮罩的情况下对变换进行动画处理修改对 Transform 时,会覆盖 Gesture 层的所有手势变换 Transform。
  • 在基 2 状态开关切换中,相比于 Write DefaultsDefault On ON,帧时间增加了50%的帧时间((仅在 Unity 2019中)2019)。

创作指南

这些指南适用于创建应同时兼容 Write Defaults OnWrite Defaults Off 兼容的预制件时,这些指南将非常有用

  • 确保每个动画中都包含只对一组其专有,不同于其他图层所拥有的属性进行动画属性(例如,图层中的每个状态动画化相同的一组属性进行动画)。
  • 如果需要在多个上动画化中对同一属性进行动画确保每个状态包含一个动画片段并注意较低层会覆较高层,始终在顶部提供保留一个具有 Reset 层作为默认状态的“重置”图层

如果遵循本文中概述的指南,每个属性都将始终会被动画化,并且您动画系统将始终与可以兼容 Write Defaults OnWrite 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 → Clamp Blendshapes (Deprecated) 来启Blendshapes(已弃这个功能在 VRChat 中已被启用了此选项)
  • 修复此解决这个问题的正确方法是有一个动画始终明确设置地对 Blendshape 值进行动画处理
  • 糊弄式修复此问题一种快捷且不太完善解决方法是设置空闲层中的状态设置Write Defaults OnOn。