对于 VRChat Avatar 而言,Animator 的存在有点特殊:
- VRChat Expression 系统独立于 Animator,只有设置在 VRC Avatar Descriptor 的 Playable Layers 上的控制器才可以被圆盘菜单写入参数
- VRChat Avatar 不直接使用你的模型上 Animator 中指定的 Animator Controller,而是从上到下依次应用 Playable Layers 中的控制器。
这就导致了 VRChat Avatar 子级中的 Animator 做不了太多的事,因为它无法被用户输入所影响。不过用来实现一些循环动画或者利用 Animator 被启用/关闭时的特性还是有意义的。
但那些 Modular Avatar 预制件上的 Animator 组件是怎么回事?上文说,这些 Animator 是无法访问 VRChat Expression Parameters 的。
实际上,这样做的动机是让预制件可移植,自我包含,不用担心参数冲突或者动画路径出错。这是 Modular Avatar 的设计目标(即,让预制件可以被轻松的安装和删除)。
上面的回复中已经提到,Animator 中 Animator Controller 中 Animation Clip 的对象路径是相对于 Animator 组件的,因此移动或者修改 Animator 组件所在的 GameObject 的路径和命名不会影响动画的工作:因为路径是相对 Animator 的。
但是,只有 Playable Layers 中的 Animator Controller 能访问 VRChat 的参数系统,因此 Animator Contorller 必须被合并进这些控制器(一般是 FX)。因此,MA Merge Animator 组件提供的合并模式中提供了 相对路径
模式,它会在构建时,以 VRChat Avatar Descriptor 所在的顶层 GameObject 为根,自动重写 Animator Controller 中引用的所有 GameObject 路径。
现在合并手段有了,那该如何录制所需的相对路径动画呢?Unity 中,Animator 与 Animator Controller 是组合使用的,要想正确录制一段动画,就需要:
- 存在一个 Animator
- Animator 中指定了 Animator Controller
- Animator Controller 中存在一个 State,且指定了一个 Animation Clip
选中这个 Animator 后,就可以在动画(Animation)窗口录制 Animator 组件所在的 GameObject 子级的动画了。
聪明的你,现在是否明白了那些 MA 预制件上的 Animator 是做什么用的了呢?答案就是方便录动画。
有些时候,你可能会发现有些衣服作者提供的 unitypackage 导入后,衣服预制件上有个 animator,这是为什么呢?
答案是这些作者忘记将衣服的 .fbx 导入设置中 Rig 选项卡 的“动画类型(Animation Type)”修改为 Generic 或者 None。Unity 会自动为 Humanoid 类型的 .fbx 生成一个包含了 Avatar Rig(不是 VRChat 那个 avatar)的 Animator。
对于 VRChat Avatar 开发而言,这个 Animator 没有任何意义,可以直接删除。也可以修改导入设置取消 Avatar Rig。