动画控制器(Animator Controllers)
动画控制器是一种资源,设计用于在放置在动画器中时在游戏对象及其子对象上播放动画。它的功能是将多个动画层混合在一起,生成一个最终的效果列表,应用于动画器。有关动画器如何将动画控制器的输出转换为虚拟形象上的实际变化的更多信息,请参阅动画器。
动画层
动画层允许我们创建一个动画状态的状态机,其中包括一组动画状态、一个初始动画状态以及状态之间的过渡。一个动画层始终要么在播放一个动画状态,要么在两个动画状态之间进行过渡(混合)。可以通过按下层视图右上角的 +
按钮来添加新层。
动画层默认有三个“状态”:
-
任意状态
Any State
:此状态是一个象征性状态,代表所有状态。因此,从任意状态Any State
开始的过渡等同于从动画层上的每个状态开始的过渡。 -
退出
Exit
和进入Entry
状态:任何进入退出Exit
状态的过渡都会评估来自进入Entry
状态的过渡,过渡到它可以到达的第一个状态,如果没有匹配的过渡,则过渡到默认状态。
注意:默认状态是橙色显示的状态。可以通过右键单击
另一个状态并选择Set as Layer Default State
(设置为层默认状态)来更改它。这也是层开始时所在的状态。
默认动画层
参数
动画控制器使用参数来控制其状态机中当前活动的状态。参数用于检查当前状态是否应过渡到下一个状态。
有关参数使用的更多信息,请参阅动画过渡页面。参数有不同的类型:Bool
(布尔), Int
(整数), Float
(浮点) 和 Trigger
(触发器)。
-
布尔值参数可以是真或假,通常用于只需要两个值的基本逻辑:开或关。
-
整数参数存储整数,如0、1、-10或10293,但不包括0.5或-1.1。它们通常用于排他逻辑,例如如果你有五套不同的服装可以切换。
-
浮点数参数存储小数值,如0.5、1.7、-1和1024.123。它们是唯一可以用于混合树的参数(有关混合树的更多信息,请参阅混合树(Blend Trees)),并且只能使用大于或小于进行比较,不能使用等于(因为它代表数轴上的一个点)。
-
Trigger
(触发器)参数类似于Bool
(布尔)参数,因为它们的值要么为真(true),要么为假(false),但每当它们用于更改状态时,它们会自动重置为假(false)。这使得它们对触发器有用,但由于没有内置的 VRChat 等效功能,它们在VRChat中没有太多用途。
由VRChat表达式参数同步的参数在通过网络发送到远程玩家时不会保留其完整范围。具体来说,Int
(整数)参数被限制在[0, 255]之间,而 Float
(浮点)参数被限制在[-1, 1]之间,但只能是1/127的倍数。
高级细节
混合权重与混合模式
在播放模式或游戏中,所有层的当前播放动画状态的动画片段/混合树会被动画控制器混合在一起,生成最终结果。
这是通过将第一个值作为基础,然后迭代地混合其下方的每一层来获得当前值。混合是基于混合权重进行的,效果会乘以混合权重。
层的混合方式取决于混合模式。
Override
(覆盖)混合模式给出以下公式:
NextValue = CurrentValue + NewWeight * (NewValue - CurrentValue)
而 Additive
(叠加)混合模式给出以下公式:
NextValue = CurrentValue + NewWeight * NewValue
示例:
一个动画层处于一个动画状态,该状态有一个动画片段将混合形状设置为50,并且权重为1(第一层的权重始终为1)。
另一个动画层,混合模式设置为覆盖,处于一个动画状态,该状态有一个动画片段将相同的混合形状设置为100,并且权重为0.5。
现在,混合形状的最终应用值将为50 + 0.5 * (100 - 50) = 75。
一个动画层及其配置。请注意,最顶层的权重无法更改。它将始终设置为1。
第二个动画层,其权重可以更改。
混合权重值默认设置为0,这意味着该层处于非活动状态。要激活该层,请将混合权重设置为更高的值,通常为1。
虚拟形象遮罩
虚拟形象遮罩可以屏蔽当前播放动画的某些部分。可以通过 右键单击
→创建→虚拟形象遮罩来创建它们。
在它们的检查器中,你可以启用和禁用某些人形肌肉和变换的动画。这允许你通过屏蔽动画的某些部分在多个地方重复使用一个动画。
要禁用虚拟形象上的变换,你必须将FBX中的虚拟形象放入 Avatar
(虚拟形象)插槽,然后按下 Import Skeleton
(导入骨骼)按钮。这将显示FBX上的所有变换,并允许你启用/禁用它们。
有关虚拟形象遮罩在Unity和VRChat中的效果的更多信息,请参阅虚拟形象遮罩。
创建虚拟形象遮罩
虚拟形象遮罩检查器。此区域可用于启用和禁用某些人形肌肉和变换的动画。
同步/时间
同步复选框允许你同步两个层,除了动画。这意味着状态机完全相同,无论源层处于什么状态,同步层也处于什么状态。这将根据层权重和混合模式将两个当前的动画片段/混合树合并在一起。
如果 Timing
(时间)复选框关闭,同步层的动画将被拉伸或压缩以与源层的时间相同。
如果 Timing
(时间)复选框打开,同步层的动画和源层的动画的时间将根据层权重组合成最终时间。
在检查器中同步两个层的样子。这里,同步层具有与源层完全相同的状态机,除了这些状态中的动画。
IK传递
如果启用了 IK Pass
(IK传递)复选框,同一游戏对象上的脚本将接收到 OnAnimatorIK(int LayerIndex)
回 调。此回调可用于根据动画器动画的对象的位置更新IK目标。这对于无法上传外部脚本的 VRChat 内容完全无用。
No Comments