Skip to main content

PhysBones

PhysBones 是一组组件,让你可以为化身和世界中的物体添加次级运动,使你能够为头发、尾巴、耳朵、衣物、线缆、植物等添加运动效果!善用这些组件能让你的化身看起来更加生动真实,让世界更具沉浸感。

关于如何在化身上使用 PhysBones 的示例可以在 Avatars SDK 中找到。要访问它,请从 Unity 窗口顶部菜单栏进入 VRChat SDK\Samples,然后为你的平台选择相应的示例化身。

VRCPhysBone​

定义一组需要使用 PhysBones 进行动画的骨骼链。这些可用于模拟软体和次级运动,如头发、尾巴、松软的耳朵等!它有许多配置选项,可以通过多种方式进行设置。

此外,你和他人都可以与 PhysBones 进行交互!你可以抓取 PhysBones 来移动它们,并在抓住 PhysBone 时扣动扳机来"固定"它并保持位置。你也可以在配置中禁用这些功能,不允许固定、不允许抓取,或者完全不允许碰撞。对于附着在你化身上的 PhysBones,如果你的交互设置允许,其他人也可以抓取和固定你的 PhysBones!

虽然不是为此设计的,但在我们实现自己的 Cloth 组件之前,PhysBones 也可以作为一个不错的布料替代品。

版本​

你可以直接在组件上选择要使用的 VRCPhysBone 组件版本。默认情况下,创建新组件时会选择最新版本。现有的 PhysBone 将继续使用其以前的版本,除非手动更新并重新上传。

版本 1.0:

  • VRCPhysBone 组件的基础版本。

版本 1.1:

  • Squishy Bones 更新,允许骨骼因运动而挤压和改变长度。
  • 重力现在作为一个比例,决定骨骼在静止时旋转的程度。需要正的 Pull 值才能使骨骼沿重力方向移动。
  • 刚度现在作为一个比例,使骨骼保持在其先前的方向上。

变换​

Root Transform - 此组件开始的变换。如果留空,则假定从该游戏对象开始。
Ignore Transforms - 不应受此组件影响的忽略变换列表。被忽略的变换会自动包含该变换的所有子级。
Ignore Other Phys Bones - 启用后,PhysBone 会忽略场景层级中自身下方的其他 PhysBone 及其受影响的变换。此选项默认启用,禁用以外的行为可能不受支持。
Endpoint Position - 用于在骨骼链的每个端点处创建额外骨骼的向量。仅当值为非零时使用。通常你会希望沿 +Y 方向增加,这指向骨骼的"上方"。
Multi-Child Type - 当存在多个骨骼链时根骨骼的行为。有三种模式:

如果设置为 Ignore,根骨骼将不会移动,并忽略物理效果。适用于化身头发等场景,因为你可以使用一个 PhysBone 组件在根部影响所有头发骨骼!

如果设置为 First,根骨骼将与层级中的第一个骨骼链形成一个连续的链条。其他每个链仍然有效,但它们将从各自链中的第一个骨骼开始,而不是像第一个链那样从根部开始。

如果设置为 Average,根骨骼的运动将是所有其他链的平均值。这意味着每个链的基部将能够移动。

caution

如果你使用单个根骨骼,或一个根骨骼带有多个子级(但没有孙级),你必须定义端点位置!

例如,如果你将 PhysBone 组件放在以下任何 RootBone 上,你必须定义一个 Endpoint Position 才能使 PhysBones 正常工作。这与 Dynamic Bones 不同!

单骨骼

  • RootBone

多子级,单根

  • RootBone
  • ChildBone1
  • ChildBone2
  • ChildBone3
  • ChildBone4

你也可以通过在每个 ChildBone 之后添加"末端骨骼"来解决此问题,但这涉及编辑骨架。

力​

Integration Type 定义了用于模拟受此组件影响的任何变换运动的数学方法。根据你的选择,"力"部分中的可用选项将发生变化。你可以在两种类型之间选择:

  • Simplified(简化)是一种更稳定的方法,感觉稍慢且对外部冲量和力的反应较弱,但更易于配置。
  • Advanced(高级)稳定性较差,但允许更复杂的配置,并且往往对外部冲量和力的反应更灵敏。 在默认设置下,这两种模式的表现相当类似,但调整设置并进行测试将很快揭示它们的不同之处。
info

以下大多数(如果不是全部)选项都允许通过按滑块旁边的 C 按钮来使用曲线。曲线允许你沿骨骼链长度调整数值,并实现骨骼链内非常复杂的设置!

事实上,大多数 PhysBones 设置都允许使用曲线!学会使用它们,你的 PhysBones 将会看起来惊人!

physbones-054e326-2022-04-19_11-32-12_Unity.png

Pull(拉力) - 用于将骨骼恢复到其静止位置的力的大小。
Spring(弹簧) - 骨骼在尝试到达其静止位置时的摆动量。仅在 Simplified 积分类型中可用。
Momentum(动量) - 骨骼在尝试到达其静止位置时的摆动量。仅在 Advanced 积分类型中可用。尽管描述相同,但效果与 Spring 略有不同。
Stiffness(刚度) - 骨骼试图保持在其静止位置的程度。仅在 Advanced 积分类型中可用。
Gravity(重力) - 施加到骨骼上的重力大小。正值将骨骼向下拉,负值向上拉。
Gravity Falloff(重力衰减) - 仅在 Gravity 非零时可用。它控制在静止位置时减少多少重力。值为 1.0 意味着在静止位置时重力完全不影响骨骼。这允许你在骨骼从初始位置旋转时产生重力效果,而不影响骨骼的静止状态。

使用 Gravity Falloff 参数的一种方式是,如果你的化身头发建模为在正常站立时已处于你想要的姿势,你可以使用 1.0 的重力衰减。这样,当你只是站在那里时,重力不会影响你,你的头发将保持在建模位置。如果你的头发建模为 45 度笔直向外,并且你希望它受到足够重力影响以形成漂亮的曲线(但不是完全笔直向外或完全笔直向下),滑块允许你进行调整,使用 0.5-0.8 使其在静止姿势时只受到一部分重力。

Immobile Type(不动类型)改变了 Immobile 的工作方式。

如果设置为 All Motion(所有运动),Immobile 会减少从根变换的父级计算出的任何运动。这是新 PhysBones 和转换后的 Dynamic Bones 的默认模式。在此模式下,所有在场景空间或游玩空间中的 PhysBone 运动都将被 Immobile 因子减弱。

如果设置为 World (Experimental)(世界(实验性)),Immobile 仅抵消来自场景根变换参考的位置运动。通过动画或 IK 的运动仍然正常影响骨骼。此模式未来可能会更改!

在你使用的化身的上下文中,这意味着在游玩空间中移动仍然会正常影响你的 PhysBones 运动,但 locomotion(推动摇杆移动)的运动将被 Immobile 因子减弱。

限制​

设置限制允许你限制 PhysBone 链可以移动的范围。这对于避免化身上头发穿模到头内等情况非常有用,并且比碰撞体性能高得多!

此外,在配置限制选项时,当你选中 PhysBone 链时,场景视图中将显示这些限制的可视化效果。这在微调限制时非常有用!

Limit Type(限制类型)有几种模式。它们都允许以 Pitch(俯仰)、Yaw(偏航)和 Roll(滚转)来调整 Rotation——也就是分别沿 X、Y 和 Z 轴。

None(无)​

None 表示此骨骼链上未启用限制。没有配置选项。

Angle(角度)​

physbones-b7abe1f-2022-04-19_11-49-26_Unity.png

Angle 表示骨骼链将被限制在某个 Max Angle(最大角度)内,以 Rotation 定义的轴为中心。在场景视图中显示为锥体。

Hinge(铰链)​

physbones-b7723cc-2022-04-19_11-50-04_Unity.png

Hinge 表示骨骼链将被限制在由 Rotation 定义的平面上的某个 Max Angle 内。在场景视图中显示为一个圆形的切片,类似于披萨或馅饼。

Polar(极坐标)​

physbones-824db3c-2022-04-19_11-51-22_Unity.gif

Polar 稍微复杂一些。如果你拿一个 Hinge 并使其在 Yaw 方向上扫过一定量,你会得到极坐标 Polar 下的球体片段。你可以配置 Max Pitch 和 Max Yaw 来调整片段的大小,并使用 Rotation 来定义该片段在球体上的位置。Polar 的可视化效果特别有帮助。

不要过度使用 Polar 限制,因为它们有非零的性能成本。使用大量(粗略估计:超过 64 个)可能会导致一些问题。如果你的 Max Pitch 和 Max Yaw 值相似或相同,使用 Angle 限制就足够了,并且性能成本更低。

碰撞​

Radius(半径) - 每个骨骼周围的碰撞半径,单位为米。用于碰撞和抓取。
Allow Collision(允许碰撞) - 允许与此组件上指定的碰撞体之外的碰撞体发生碰撞。
Colliders(碰撞体) - 与此骨骼链特定碰撞的碰撞体列表。

Allow Collision 有三个可用选项:

如果设置为 True,此 PhysBone 将与全局碰撞体发生碰撞。这包括每个玩家化身定义的手部碰撞体,以及化身上或世界中任何自定义的全局碰撞体。

如果设置为 False,此 PhysBone 将仅与 Colliders 列表中列出的碰撞体发生碰撞。

如果设置为 Other(其他),你将获得更多选项来控制碰撞行为,基于这是化身还是世界。对于化身上的 PhysBone,你可以过滤为此化身和其他化身/世界上的碰撞体。对于世界中的 PhysBone,你可以设置它是否能够响应世界、化身、物品或这三者混合中的碰撞体。

拉伸与挤压​

Stretch Motion(拉伸运动) - 运动影响骨骼拉伸/挤压的程度。值为零意味着骨骼仅在抓取或碰撞时才会拉伸/挤压。
Max Stretch(最大拉伸) - 骨骼可以拉伸的最大量。该值是原始骨骼长度的倍数。注意:最大边界
Max Squish(最大挤压) - 骨骼可以收缩的最大量。该值是原始骨骼长度的倍数。

抓取与固定​

Allow Grabbing(允许抓取) - 允许玩家抓取骨骼。在化身上,你可以选择在穿戴该化身的用户和其他用户之间进行过滤。
Allow Posing(允许固定) - 允许玩家在抓取后固定骨骼。在化身上,你可以选择在穿戴该化身的用户和其他用户之间进行过滤。
Grab Movement(抓取运动) - 控制被抓取的骨骼如何移动。值为零时,骨骼使用拉力和弹簧到达抓取位置。值为一时,骨骼立即移动到抓取位置。
Snap To Hand(吸附到手) - 当骨骼被抓取时,它将吸附到抓取它的骨骼上。

选项​

Parameter(参数) - 仅适用于化身 PhysBones 的选项(参见世界中的 PhysBone Udon 访问了解如何从世界中的 PhysBone 获取此数据)。这是一个前缀,用于向化身控制器提供多个参数。例如,在以下项目中,将 Parameter 设置为 Tail 会将 {parameter} 替换为 Tail。

一旦 Parameter 设置为任何值,以下参数将在你的化身动画控制器上设置:

  • {parameter}_IsGrabbed [Bool] - 骨骼当前是否被抓取

  • {parameter}_IsPosed [Bool] - 骨骼被抓取后是否被固定

  • {parameter}_Angle [Float] - 范围 0.0-1.0。末端骨骼与其原始静止位置之间归一化的 180 度角度。换句话说,如果你将骨骼完全旋转到与其起始方向相反的方向,此参数的值将为 1.0。

  • {parameter}_Stretch [Float] - 范围 0.0-1.0。骨骼接近其最大拉伸长度的程度。

  • {parameter}_Squish [Float] - 范围 0.0-1.0。骨骼接近其最大挤压长度的程度。

Is Animated(已设置动画) - 允许骨骼变换被动画化。每帧骨骼静止位置将根据动画内容进行更新。必须启用此选项,PhysBone 链中的任何骨骼(包括根骨骼!)才能响应应用于其上的动画。

Reset When Disabled(禁用时重置) - 当此组件被禁用时,骨骼将自动重置到其默认位置。

Gizmos​

这些设置控制 PhysBone 在 Unity 编辑器场景视图中的显示方式。它们对你的 PhysBone 行为没有影响。

Show Gizmos(显示 Gizmos) - 是否在场景视图中显示此组件的 Gizmos。如果看不到它们,请确保场景视图本身也已启用 Gizmos。
Bone Opacity(骨骼不透明度) - 设置表示骨骼本身的 Gizmos 的不透明度。
Limit Opacity(限制不透明度) - 设置表示应用于骨骼的运动限制的 Gizmos 的不透明度。

重要提示、使用技巧等​

不要让约束(Constraint)和 PhysBone 组件影响同一个游戏对象,因为这会导致执行顺序问题。

应将约束应用于父级游戏对象。你仍然可以将约束的源变换设置为原始游戏对象。

caution

化身 PhysBones 在 Meta Quest 上存在硬性限制。 这是为了防止在 Meta Quest 设备上性能下降,这些设备的 CPU 资源通常已经较低。

你可以将这些限制视为 最低显示性能等级 文档中描述的 Quest 的 Very Poor 限制。

此硬性限制不适用于世界,但如果你的世界在移动设备上可用,仍应考虑限制 PhysBones 的数量,以避免导致性能问题而将玩家挤出你的世界。

每个组件的限制​

单个 PhysBone 组件一次不能影响超过 256 个变换。 这包括根骨骼以及所有子级。这也影响化身上的 Dynamic Bone 转换!

但是,你应尽量避免一开始就有那么多变换需要动画。尝试将链中的骨骼向上合并到其直接父级。社区创建的工具如 Cat's Blender Plugin 可以为你完成此操作。

更改 PhysBone 属性​

PhysBone 属性如 Spring、Pull、Stiffness 等是在初始化时设置的。

在化身上,这些值旨在保持恒定,并且不能被动画化。但是,如果你对 PhysBone 组件的属性进行动画,然后将该组件关闭再打开,你_可能_会得到你想要的行为。请注意,这不是动画化这些属性的受支持方法,并且在未来的更改中将不受支持。(换句话说,它可能会出问题,如果出了问题,我们不会尝试修复它。)

在世界中,你可以通过 Udon 脚本来更改 PhysBone 的属性,但仍应尽量限制这样做的频率。更多信息请参见世界中的 PhysBone Udon 访问。

人形骨骼​

不要将人形骨骼设置为 PhysBone 根骨骼。 也就是说,不要将 Hip、Spine、Chest、Upper Chest、Neck、Head 或任何肢体骨骼设置为根骨骼。这会导致重大问题。

相反,应复制你想用作根的骨骼,然后将所有要动画化的子骨骼重新父级到新的复制根。这应在 Blender 中完成。社区创建的工具如 Cat's Blender Plugin 可以为你完成此操作。

PhysBone 旋转​

与 Dynamic Bones 不同,PhysBone 链的根骨骼允许旋转。 但它不能平移。这可能会在某些设置下产生一些后果——请自行尝试以了解其行为。

PhysBone AV3 参数​

当影响 AV3 化身参数时,无需使用 VRCExpressionParameters 对象定义的同步参数。这些参数已在本地和远程机器上更新,因为两者都将运行 PhysBones。

PhysBone Immobile 行为​

Dynamic Bones 的 Inert 值基于组件放置的位置,而不是根变换。这可能是 Dynamic Bones 的一个错误。因此,PhysBones 的 Immobile 值基于根变换。这在某些情况下可能会影响行为。

最佳组件使用​

由于 PhysBones 的多线程特性,将所有骨骼放入单个链中并不总是最高效的。多个组件允许我们在线程之间分配工作。但是,你仍应力求减少组件数量……但与 Dynamic Bones 相比,化身上或世界对象上有几个组件并不那么糟糕。

如果你_真的_需要一个数字,当单个组件影响超过 128 个变换时,应考虑拆分骨骼链组。如果你有一条带有 256 根骨骼的裙子,且在根部有分叉,将其拆分为两到三个组件即可。

但是,如果你只处理大约 32 根骨骼……那就不用担心了。你可能已经看出,这些并不是严格的规则!我们可能会在以后引入一些软性警告,当某些设置看起来应该采用不同方式时。

最大边界​

每个 VRCPhysBone 组件都有一个边界框,随着骨骼移动而增长和缩小。这些边界框有助于玩家触摸和抓取 PhysBones 时的碰撞检测。为了提高效率,边界框被强制限制为最大 10×10×10 米。PhysBones 可以超出此范围并继续正常工作。但是,玩家可能无法根据其位置触摸或抓取这些骨骼。

边界框仅考虑具有碰撞且半径大于零的骨骼。在你想要提供极长拉伸的情况下,只要在拉伸点之后存在具有碰撞的骨骼,就可以避免达到此最大边界限制。

世界中的 PhysBone Udon 访问​

尽管最初是为化身设计的,PhysBones 也可以在世界中使用。在世界中与 PhysBone 交互时,应使用 Udon 脚本而不是动画控制器。以下是世界中处理 PhysBone 的关键区别:

  • 使用类型 VRCPhysBone 访问 PhysBone,该类型位于命名空间 VRC.SDK3.Dynamics.PhysBone.Components 中。
  • 要检测 PhysBone 何时被抓取、释放、固定或取消固定,你可以将 UdonGraph 或 UdonSharp 行为附加到与 PhysBone 组件相同的游戏对象上,并使用以下事件:
    • OnPhysBoneGrabbed(PhysBoneGrabbedInfo physBoneInfo) - 当 PhysBone 被玩家抓取时调用。
    • OnPhysBoneReleased(PhysBoneReleasedInfo physBoneInfo) - 当 PhysBone 从玩家的抓取中释放时调用。
    • OnPhysBonePosed(PhysBonePosedInfo physBoneInfo) - 当 PhysBone 被玩家锁定到某个姿势时调用。
    • OnPhysBoneUnPosed(PhysBoneUnPosedInfo physBoneInfo) - 当 PhysBone 的姿势被释放时调用。
  • 你可以分别使用 IsGrabbed 和 IsPosed 属性检查 PhysBone 当前是否被抓取或固定。
  • 你可以随时使用 Angle、Squish 和 Stretch 属性读取 PhysBone 的角度、挤压和拉伸值。
  • 你可以通过适当命名字段(pull、stretch 等)以及这些属性可以使用的曲线(pullCurve、stretchCurve 等)来读取和设置 PhysBone 的所有属性。
    • 如果你更改了这些属性,必须在完成所有更改后在 PhysBone 上调用 ApplyConfigurationChanges(),否则更改将不会实际应用到 PhysBone。
    • PhysBones 的配置更改可能会很昂贵! 如果过度使用,可能会导致性能问题,使你的世界让玩家感到不适——避免过于频繁地更改这些属性,并尽量在应用之前将尽可能多的更改批量处理。
  • 如果你的 PhysBone 允许抓取或固定,你可以使用下面的 Udon 方法强制停止这些交互。这些仅在本地客户端上运行,因此如果你想要释放所有人的抓取或固定,你需要从所有客户端接收的网络事件中调用这些方法。
    • 当你调用 ReleaseGrabs() 时,如果本地玩家当前正在抓取 PhysBone,他们将被迫松开。
    • 当你调用 ReleasePoses() 时,应用于 PhysBone 的任何冻结姿势将被释放,使其恢复其自然形状。

VRCPhysBoneCollider​

定义将影响配置正确的 PhysBones 的碰撞体。

Root Transform - 此碰撞体放置的变换。如果留空,则使用此游戏对象的变换。
Global Collision(全局碰撞) - 所选内容类型中的所有 PhysBones 都将此碰撞体视为其碰撞体列表的一部分。在决定是否实际处理碰撞时,PhysBone 的 Allow Collision 规则仍然适用。化身最多限制为四个启用了 Global Collision 的 PhysBone 碰撞体。世界对全局碰撞体没有限制。
Shape Type(形状类型) - 此碰撞体使用的碰撞形状类型。你可以在 Sphere、Capsule 或 Plane 碰撞体之间选择。Global Collision 仅支持 Sphere 和 Capsule 碰撞体。
Radius(半径) - 从原点延伸的碰撞体大小。
Height(高度) - 胶囊沿 Y 轴的高度,包括两端的一半球体。仅在形状类型设置为 Capsule 时使用。
Position(位置) - 从根变换的位置偏移。
Rotation(旋转) - 从根变换的旋转偏移。
Inside Bounds(内部边界) - 启用时,此碰撞体将骨骼包含在其边界内,而不是将其排除在外。
Bones As Sphere(骨骼作为球体) - 启用时,此碰撞体将 PhysBone 碰撞半径视为以骨骼位置为中心的球体,而不是沿着骨骼长度的胶囊体。

标准碰撞体​

在化身上,一组"标准碰撞体"在 Avatar Descriptor 的"Colliders"部分中定义。此部分允许你定义在每个化身上存在的一些标准碰撞体。如果你不进行修改,它们将自动设置,但也可以进行调整以精确适配你的化身。这些碰撞体不影响性能等级。

  • 头部(Head)
  • 躯干(Torso)
  • 手部 L/R(Hands L/R)
  • 脚部 L/R(Feet L/R)
  • 手指 L/R(Fingers L/R)
    • 食指(Index)
    • 中指(Middle)
    • 无名指(Ring)
    • 小指(Little)

这些碰撞体主要作为联系人发送器,使用内置身体部位标签,其他人可以使用他们的化身进行检测。但是,手指和手部碰撞体也用于创建全局 PhysBone 碰撞体,可用于影响他人的 PhysBones 以及世界中的 PhysBones。

世界中的碰撞体 Udon 访问​

与 PhysBones 类似,在世界中工作时也可以使用 Udon 访问和修改 PhysBone 碰撞体的主要属性。你应该使用 Udon 脚本而不是动画控制器来修改世界中的碰撞体。

  • 使用类型 VRCPhysBoneCollider 访问 PhysBone 碰撞体,该类型位于命名空间 VRC.SDK3.Dynamics.PhysBone.Components 中。
  • 你可以读取和设置 PhysBone 碰撞体的以下属性:shapeType、radius、height、position 和 rotation。
    • 如果你更改了这些属性,必须在完成所有更改后在 PhysBone 碰撞体上调用 ApplyConfigurationChanges(),否则更改将不会实际应用到碰撞体。
    • PhysBone 碰撞体的配置更改可能会很昂贵! 如果过度使用,可能会导致性能问题,使你的世界让玩家感到不适——避免过于频繁地更改这些属性,并尽量在应用之前将尽可能多的更改批量处理。

VRCPhysBoneRoot​

此组件允许你为一个或多个 PhysBone 组件定义运动根,并设置在移动时它们应使用固定时间还是实时更新。此组件是可选的,仅适用于世界。

Timing(计时) - 设置附加此组件的游戏对象的所有子级 VRCPhysBone 链使用的计时模式。

你可以在三种计时选项之间选择:

  • Automatic(自动,默认):子级 PhysBones 自动确定是在固定时间还是实时移动。它可以根据变换的移动方式在两者之间动态切换,以最小化可见抖动。
  • Fixed Time(固定时间):子级 PhysBones 在固定时间内更新,即使用与 Unity 的 FixedUpdate() 回调对应的固定时间步长。
  • Real Time(实时):子级 PhysBones 实时更新,即使用与 Unity 的 Update() 回调对应的可变时间步长。

当没有手动定义运动根时,PhysBones 会尝试自动确定应使用的更新计时。

自动 Dynamic Bone 转换​

note

世界中的 Dynamic Bone 组件不会自动转换为 PhysBones。我们建议使用 PhysBones 来提升性能,并允许玩家抓取和与 PhysBones 交互。

客户端在加载化身时始终会自动将化身中的 Dynamic Bones 转换为 PhysBones。这是为了提高整体性能,并且对于化身之间的交互也是必需的。

默认情况下,Dynamic Bone 转换使用 Advanced 模式,因为我们能够通过 Advanced 积分方法更精确地匹配 Dynamic Bone 行为。此外,Dynamic Bone 转换对 Multi-Child 类型使用 Ignore。这可能会在某些边缘情况的 Dynamic Bone 设置中导致问题,但在转换过程中,在几乎所有情况下使用 First 或 Average 都会导致不期望的行为。

需要注意的是 Dynamic Bones 和 PhysBones 并不完全相同。 程序内转换过程会尽力尽可能接近地匹配行为,但它永远不会完美!自动转换的目标是使大多数设置能够正常工作且不崩溃,而不是完美复制行为。预计所有为 VRChat 制作化身的用户现在都已转向使用 PhysBones 而不是 Dynamic Bones。

手动 Dynamic Bone 转换​

你可以选择使用 SDK 将你的化身从 Dynamic Bones 转换为 PhysBones。

此过程会删除化身中先前的 Dynamic Bone 组件,且不容易撤销。因此,在尝试此转换之前,请备份你的化身。

你可以在 SDK 的 Build Control Panel 中访问此工具,或通过 Unity 菜单 VRChat SDK/Utilities/Convert DynamicBones to PhysBones 访问。必须预先选中化身才能正常工作。

未迁移的 Dynamic Bone 组件​

Dynamic Bones 中的某些功能和行为在 PhysBones 中不存在,因此不会迁移。

Dynamic Bone 的 Gravity 和 Force 值在 X 或 Z 方向上的分量会被忽略,因为它们在 PhysBones 中没有等效项。

Dynamic Bone 弃用​

在化身方面,Dynamic Bones 已从 VRChat 中完全移除。这意味着所有仍在使用 Dynamic Bones 的旧版化身现在将使用自动生成的 PhysBones。

Dynamic Bones 目前在世界中仍可使用,但我们最终可能会以类似化身的方式弃用它们,在加载世界时自动将其转换为 PhysBones。