Skip to main content

状态行为(State Behaviors)

需要 Unity 知识

本文档的编写假设你对 Unity Animator 有一定了解。

当你在 Animator 视图中选中某个特定状态时,你可以添加状态行为。它们有点像状态的组件,具有不同的功能。试着添加它们,你就会看到它们能做什么!

所有状态行为都在过渡到该状态的第一帧运行。

状态行为应该无论状态机在包含该状态行为的狀態中停留多久都会运行。

caution

这里特意使用了"应该"一词,因为 Unity 文档 中并未定义在过渡或状态持续时间非常短的情况下,状态行为一定会执行。

如果你想要完全安全,请确保在包含状态行为的状态以及直接过渡到该状态的总时间至少为 0.02 秒——尽管在实践中,这似乎不是必需的。

动画器层控制器(Animator Layer Controller)​

VRC Animator Layer Control 组件

Animator Layer Control 允许你在任意给定的可播放层中,在任意给定时间内混合特定动画器层的权重。

如果在混合持续时间内退出了该状态,目标层将立即设置为目标权重。

层权重将保持不变,直到其他某个状态再次运行此状态行为并将其重置。

属性名用途
Playable允许你选择要影响的可播放层。
Layer你要影响的可播放层的索引。你不能更改第 0 层(基础层)的权重——它始终设置为 1.0 权重。
Goal Weight定义你想要混合到的权重。
Blend Duration定义混合所需的时间(以秒为单位)。0 表示立即完成。
Debug String当此状态行为运行时,此字符串将打印到输出日志。用于调试。

动画器移动控制(Animator Locomotion Control)​

VRC Animator Locomotion Control 组件

Animator Locomotion Control 允许你在动画器的特定状态中禁用移动。移动状态将保持不变,直到其他某个状态再次运行此状态行为并更改它。

在桌面模式下,此功能禁用平移运动,并将旋转(视角)运动限制在垂直轴上。在 VR 中,此功能禁用平移和旋转控制器运动,并限制半身 IK(全身 IK 不受影响)。在两种模式下,玩家的碰撞体都会被固定在原地。

参数描述
Disable Locomotion如果设置为 True,移动(使用控制器移动)将被禁用。房间尺度移动仍然可能。如果设置为 False,将启用移动。
Debug String当此状态行为运行时,此字符串将打印到输出日志。用于调试。

动画器临时姿势空间(Animator Temporary Pose Space)​

VRC Animator Temporary Pose Space 组件

Animator Temporary Pose Space 控制允许你将穿戴虚拟形象的人的视角移动到动画器状态该特定点的头部位置。

视角将保持不变,直到其他某个状态再次运行此状态行为并将其重置或清除。

此行为在延迟时间过后执行。

Animator Temporary Pose Space 只应在由于姿势变化(如坐下或躺在地面上)需要更新视角高度时使用。它不能用于"缩放"穿戴的虚拟形象,如果以这种方式使用,将导致严重的破坏性问题。

danger

如果此状态行为所在的状态在 Delay Time 过去之前被退出或中断,该状态行为将不会执行!

属性名用途
Pose Space进入或退出。Enter 设置姿势空间,exit 将其清除为默认值。
Fixed Delay延迟时间应该是固定时间段,还是状态持续时间的百分比?
Delay Time如果给定一个值,视角将在延迟后设置。如果你正在一定时间内混合进入一个动画,这很有用。
Debug String当此状态行为运行时,此字符串将打印到输出日志。用于调试。

动画器追踪控制(Animator Tracking Control)​

VRC Animator Tracking Control 组件

Animator Tracking Control 允许你在虚拟形象身体的不同部位启用或禁用 IK 或模拟运动。将选项设置为"No Change"将不会改变该身体部位的当前值。"Tracking"将使其跟随 IK 或模拟运动。"Animation"将强制该身体部位遵循虚拟形象动画器给出的值。

如果你将所有 IK 追踪点设置为 Animation,你的动画将作为动画远程播放,而不是通过网络 IK 进行传输。对于各种追踪类型,这些"IK 追踪点"是:

  • 桌面模式:头部、左手、右手
  • 3 点追踪:头部、左手、右手
  • 6 点 / FBT 追踪:头部、左手、右手、臀部、左脚、右脚
note

除眼睛和眼睑(它们是模拟的)外,所有部位都由 IK 驱动。嘴巴和下颌由 viseme 驱动。

例如,将左手和右手设置为 Animation 将忽略由 IK 定义的手部(和手臂)位置,而是使用任何当前活动状态的运动来定义手和手臂的位置。将它们设置回 Tracking 则将使用 IK。

将眼睛和眼睑设置为 Animation 将禁用眼部运动和眼睑眨眼。将眼睛和眼睑设置为 Tracking 将重新启用模拟眼部运动和眨眼。

将嘴巴和下颌设置为 Animation 将禁用 viseme,并且 viseme 参数将停止更新。将嘴巴和下颌设置为 Tracking 将重新启用 viseme,并且它们将再次开始更新。

追踪设置将保持不变,直到其他某个状态再次运行此状态行为并将其重置。

参数描述
Tracking Control参见上述描述。
Debug String当此状态行为运行时,此字符串将打印到输出日志。用于调试。

虚拟形象参数驱动器(Avatar Parameter Driver)​

image

Avatar Parameter Driver 可以通过多种方式操作动画器参数。单个虚拟形象参数驱动器可以执行多个操作,按从上到下的顺序进行。这些操作在进入行为所在的状态时一次性完成。

Local Only 将使驱动器仅在本地运行,作为检测 isLocal 的快捷方式。

点击 "Add" 将为驱动器添加一个新操作。第一个类型(默认选中)是 "Set"。

如果修改同步参数(在 VRCExpressionParameters 对象中定义的任何内容),这些值将被限制在其最大范围内。Int [0,255] Float [-1,1]。

但是,仅在动画控制器中定义的参数(即"本地参数")仍然可以被参数驱动器修改。这些值不受限制。

你也不能驱动任何 VRChat 定义的动画器参数。

Set、Add、Random 和 Copy 适用于 float 和 int。Set、Random 和 Copy 适用于 bool。

Set(设置)​

Set 会将值直接设置到目标中的命名参数。

state-behaviors-121fe2a-2022-06-02_18-11-13_NVIDIA_Share.png

Add(添加)​

Add 会将值添加到目标中的命名参数。

正如组件所指出的,在虚拟形象的远程实例上运行时,使用 Add 可能不会产生相同的结果。使用 Add 时,建议使用同步的目标参数,并且只在本地运行驱动器。

state-behaviors-e10bb6a-2022-06-02_18-11-17_Unity.png

Random(随机)​

Random 会将目标参数设置为介于最小值和最大值之间的随机数。

正如组件所指出的,在虚拟形象的远程实例上运行时,使用 Random 可能不会产生相同的结果。使用 Random 时,建议使用同步的目标参数,并且只在本地运行驱动器。

当使用布尔参数时,你可以使用 Chance 变量来设置参数被设置为 true 的概率。

当使用 Int 参数时,你可以使用 Prevent Repeats 设置来防止连续两次选择相同的值。

state-behaviors-99c6248-2022-06-02_18-11-23_Unity.png

Copy(复制)​

Copy 会将源参数的值设置到目标参数。这可用于将一个 float 设置为匹配另一个 float,将一个 float 重新映射到不同的范围,或者完全在两种不同类型之间进行转换。

caution

VRChat 的内置参数,例如 GestureLeftWeight,可以指定但不能作为源参数使用。

state-behaviors-bffdb10-2022-06-02_18-11-30_Unity.png

在类型之间转换​

从 bool 转换时,False 计为 0,True 计为 1。

转换为 bool 时,0 为 False,任何其他值为 True。 转换为 int 时,它总是向下舍入到最接近的整数。 转换为 float 时,它会直接复制该值,即使它超出了可以同步给其他玩家的范围。

自定义范围​

你还可以使用 Convert Range 复选框启用一些额外的 UI,允许你设置自定义转换范围。这可用于重新映射值,或更精确地控制从一种类型转换为另一种类型的方式。

state-behaviors-cab639b-2022-06-02_18-35-32_Unity.png

可播放层控制(Playable Layer Control)​

VRC Animator Layer Control 组件

Playable Layer Control 允许你在指定的持续时间内将整个可播放层的权重混合到指定值。与 Animator Layer Control 非常相似,但控制的是整个可播放层。

Action 可播放层会经常使用此状态行为,因为 Action 层的默认权重为零,并且应在动画完成后始终混合回零。

如果在混合持续时间内退出了该状态,可播放层将立即设置为目标权重。

属性名用途
Layer要影响的可播放层。
Goal Weight混合完成后要目标的可播放层权重。
Blend Duration混合到该层所需的时间。0 表示立即完成。
Debug String当此状态行为运行时,此字符串将打印到输出日志。用于调试。

动画器播放音频(Animator Play Audio)​

image

"Animator Play Audio" 行为在过渡到动画状态时修改 AudioSource。它可以更改音频剪辑、音高或循环值,并且可以播放 AudioSource。

AudioSource 的相对路径(例如 Armature/Hips/Spine/)必须输入到 "Source Path" 属性中。可以通过选择音频源组件自动填写此属性。如果音频源位于虚拟形象的根部,"Source Path" 应为空。

"Playback order" 属性不能保证所有玩家听到的音频剪辑顺序相同。 例如,"Random" 设置可能为每个玩家选择不同的剪辑。如果你想确保所有玩家听到相同的剪辑,请使用多个动画状态,或将 "Playback Order" 更改为 "Parameter" 并结合同步的动画器参数。

"Animator Play Audio" 可以添加到子状态机内的状态中。但是,不建议将其添加到子状态机本身。状态行为将应用于子状态机中的每个状态过渡,这可能会导致与其他状态行为的意外交互。

属性名用途
Source Path相对于虚拟形象根部变换的 AudioSource 路径。
如果在首次过渡到此状态时未找到 AudioSource,AnimatorPlayAudio 将被禁用。
Playback Order决定过渡到此状态时选择哪个音频剪辑。
• Random:随机选择一个剪辑。(默认)
• Unique Random:随机选择一个音频剪辑,但不会连续两次选择相同的剪辑。
• Roundabout:选择第一个剪辑,然后第二个,依此类推。在最后一个剪辑之后,再次选择第一个剪辑。
• Parameter:根据 "int" 类型虚拟形象参数选择剪辑。例如,如果参数为 0,则选择第一个剪辑。参数必须在虚拟形象的 Expressions Parameters 中定义。如果找不到参数,则选择第一个剪辑。
Clips过渡到此状态时可以应用于 AudioSource 的 AudioClip 列表。
Random Volume过渡到此状态时应用于 AudioSource 的随机音量。限制在 0 到 1 之间。
• Min:最小随机音量。(默认:1)
• Max:最大随机音量。(默认:1)
Random Pitch过渡到此状态时应用于 AudioSource 的随机音高。限制在 -3 到 3 之间。
• Min:最小随机音高。(默认:1)
• Max:最大随机音高。(默认:1)
Loop过渡到此状态时是否启用或禁用 AudioSource 的循环播放。
On Enter过渡到此状态时是否开始或停止 AudioSource。
🗹 Stop Audio Source(默认:启用)
🗹 Play Audio Source(默认:启用)
On Exit退出此状态时是否开始或停止 AudioSource。
☐ Stop Audio Source(默认:禁用)
☐ Play Audio Source(默认:禁用)
Play On Enter Delay In Seconds"Play On Enter" 播放剪辑之前的延迟(如果启用)。限制在 0 到 60 秒之间。(默认:0 秒)

每个音频设置都有一个附加属性。默认情况下,它设置为 "Apply If Stopped"。如果音频源尚未播放完之前的剪辑且 "Stop Audio Source On Enter" 被禁用,这将阻止该设置被应用。

设置名称进入时
Always Apply即使音频源当前正在播放剪辑,也会应用该设置。
Apply If Stopped除非音频源已经在播放剪辑,否则应用该设置。(默认)
Never Apply该设置未使用,并在检视面板中显示为灰色。