根部件:概述与理解

Time:10 分钟

Root Part(根部件)是什么?

Weld|Weld(接合)与 Motor6D|Motor6D 等刚性 JointInstance|joint(关节)可将多个部件结合为一个“集合”。如果集合中的所有部件均未被锚固,则该集合将形成一个刚体。每个集合都将拥有一个根部件,可以通过调用 BasePart/GetRootPart 来进行获取。

Weld 和 Motor6D 关节均无方向定义。当更改 C0/C1 或为 Motor6D 添加动画效果时,Part0 和 Part1 的具体定义部件并不能决定将要移动的部件。如果希望了解各部件的移动情况,我们首先需要对根部件进行指定。

集合的 Root Part(根部件)为当刚性关节的 DataType/CFrame|CFrame 进行更新时仍然不会移动的部件。

在使用 Weld(接合)时,开发者无需对此问题过于纠结:只需使用 WeldConstraint|WeldConstraint 或在进行接合前将部件移动到指定位置即可避免这一问题。但在使用 Motor6D 制作动画效果时,则需了解会进行移动的具体部件。

进行内部处理时,我们首先需要根据下文所述的部件排序规则决定根部件,然后使用从根部件逐步扩展的刚性关节构建扩展型的树状结构。当某个刚性关节的 CFrame 更新后,关节中距离根部件最近的部件将会静止不动,而其子部件及子部件的各子项将会进行移动。简而言之,我们将会为每个集合构建一个内部的变换层次结构(Transform Hierarchy)。

下图左边为基础的 R15 Humanoid|Humanoid(人形对象)角色模型中树状结构的视觉化效果,而右边为此树状结构中部件与部件之间的移动关系。

Humanoid rig in Workspace

Humanoid rig in explorer

普通的 Humanoid(人形对象)角色模型为使用 Motor6D 进行连接的单一集合。其根部件通常为 HumanoidRootPart,原因如下:集合中的 Accessory|Accessory (饰品)通常为“无质量”部件;另外,将部件取名为 “HumanoidRootPart” 时,会使其在根据 BasePart/Size|Size(尺寸)进行排序的根部件排序规则中获取 10 倍尺寸值加成(这条规则来源于 Roblox 中添加 BasePart/RootPriority|RootPriority 前的时期)。

根部件在物理效果复制(Physics Replication)方面也有着重要作用。只有在所有客户端拥有相同根部件的前提下,物理效果复制才能够正常运行;当涉及到约束时,同时也将需要对机制结构进行统一,以保证网络所有权的正常分配。

根部件排序规则

在选择集合根部件时,集合中的部件将会按照此规则表顺序进行比较:

  1. 部件锚固(锚固部件将始终为其所在集合的根部件)

  2. BasePart/Massless|massless(无质量)部件

  3. RootPriority

  4. 旧版尺寸排序。根据以 Size(尺寸)定义的对象边界框所拥有的的最大表面区域进行排序。其中 Seat(座位)部件将获取 20 倍加成;名为 “Torso”(躯干)及 “HumanoidRootPart” 的部件将分别获取 5 倍和 10 倍加成:floor(maxPlanarSize() * 50.0) * specialMultiplier

此规则表中的最后一条规则已经过时,但仍有许多游戏在不知情的情况下运用了这条规则。为了避免这种情况的发生,开发者应当通过提升特定部件 RootPriority 值等方法对表中的其他规则进行利用,以便更为准确地决定集合的根部件。

***Roblox官方链接:根部件:概述与理解