SuperAPI AI 工具集

roblox-physics

编程与开发

查看项目

更新于 10-15 15:34

技能介绍

用途

roblox-physics 用于在 Roblox 中构建或调试载具、机械装置和移动物体。它围绕 Roblox 物理系统的核心概念组织内容,帮助开发者选择合适的约束类型、规划程序集与锚定策略、设置网络所有权,并按单位与物理属性调参。

主要能力

程序集(Assemblies)

程序集是由刚性焊接或可动关节连接的一个或多个部件,作为单个刚体模拟。关键 BasePart 属性包括:AssemblyLinearVelocity / AssemblyAngularVelocity(建议优先使用约束或 ApplyImpulse,而非直接赋值)、AssemblyCenterOfMass(在此施力产生纯线加速度)、AssemblyMass(所有部件质量之和,任一部件锚定则为无限)、AssemblyRootPart(自动选定的根部件,用于复制与网络所有权)。根部件优先级为:锚定 > 非 massless > 更高的 RootPriority > 尺寸/名称启发式。

锚定规则:锚定程序集中的一个部件会使其成为根,其余部件隐式锚定;锚定同一程序集中的多个部件会将其拆分;要锚定整个程序集,只需锚定根部件。

碰撞过滤

可使用碰撞组(Workspace:RegisterCollisionGroup,继承自 WorldRoot;BasePart.CollisionGroup)或 NoCollisionConstraint 进行部件间过滤。CanCollide、CanTouch 和 CanQuery 控制不同行为。

机械约束

除 WeldConstraint 和 NoCollisionConstraint 使用 Part0/Part1 外,所有机械约束连接一个或两个 Attachment(或 Bone)。文档列出了 WeldConstraint、RigidConstraint、HingeConstraint、PrismaticConstraint、CylindricalConstraint、SpringConstraint、TorsionSpringConstraint、BallSocketConstraint、UniversalConstraint、RopeConstraint、RodConstraint、PlaneConstraint、NoCollisionConstraint 及各自典型用途(如门/杠杆、滑动门/电梯/活塞、液压杆/起落架、弹簧/减震/悬挂、旋转弹簧、肩部/球关节、传动轴/等速万向节、缆绳/绞盘、固定间距、平面约束等)。

移动器约束

现代替换已弃用 BodyMovers 的方案,对照关系包括:BodyPosition → AlignPosition;BodyGyro → AlignOrientation;BodyVelocity → LinearVelocity;BodyAngularVelocity → AngularVelocity;BodyForce/BodyThrust → VectorForce;RocketPropulsion → LineForce + AlignOrientation;另有 Torque、LineForce、AnimationConstraint。

网络所有权

服务器拥有锚定部件;玩家角色附近未锚定部件自动归该客户端所有。可用 BasePart:SetNetworkOwner(player)(仅服务器)显式设置,用 SetNetworkOwnershipAuto() 重置。载具/驾驶员所有权需谨慎分配,否则首位就座玩家可能拥有整个程序集。安全性方面,客户端可利用其拥有的部件(传送、伪造碰撞),游戏关键事件应在服务器端验证。

睡眠系统

程序集静止时停止模拟以节省性能,在碰撞、属性变化、冲量或重力/风变化时唤醒。缓慢机制若提前睡眠,可增加运动或使用受驱动关节(马达/伺服约束,具有更严格的睡眠阈值)。可在 Studio 的 Visualization Options 中用 Awake 部件可视化睡眠状态。

物理步进方式

Workspace.PhysicsSteppingMethod:Fixed(默认,240 Hz)为通用最佳选择,适用于竞速、破坏、坦克等场景;Adaptive 将程序集分配到 60/120/240 Hz 岛,在合适体验中最多可提升约 2.5 倍性能。可用 MicroProfiler 检查岛分布。

单位速查

1 stud = 28 cm;1 RMU = 21.952 kg;默认 Classic 重力为 196.2 studs/s²;Realistic 重力为 35 studs/s²(约 9.8 m/s²)。

常见错误

使用已弃用的 BodyMovers 而非现代约束;每帧设置 CFrame 而非使用力/约束;锚定程序集中的每个部件(拆分程序集并影响性能);忽略载具网络所有权而后困惑于输入延迟;信任来自客户端所有部件的 Touched 事件用于伤害/权威判定;让受驱动关节过早进入睡眠。

脚本示例

scripts/VehicleController.lua:底盘设置,使用 HingeConstraint 转向与马达驱动,含客户端所有权与服务器验证。 scripts/DoorHinge.lua:带限位与状态机的马达/伺服门。 scripts/PlatformMover.lua:AlignPosition + AlignOrientation 平台,支持可配置路径点。 scripts/Suspension.lua:使用 SpringConstraint 的弹簧-阻尼悬挂。

使用方式

建议流程:判断对象是刚性机制(机械约束)还是力驱动(移动器约束);规划程序集、根部件与锚定策略;为多人响应性设置网络所有权;使用单位与物理属性调参力和速度;用 MicroProfiler 分析并观察睡眠/所有权可视化。

参考索引

collisions-and-filtering.md:配置碰撞组、触摸事件或空间查询过滤器。mechanical-constraints.md:用铰链、弹簧、绳索等机械约束连接部件。mover-constraints.md:施加力或速度目标,或迁移 BodyMover 代码。network-ownership.md:将物理模拟分配给服务器或玩家并调试所有权。units-and-physical-properties.md:调整质量、密度、摩擦、力或模拟步进。

官方来源包括 create.roblox.com 上的 physics、assemblies、mechanical-constraints、mover-constraints、network-ownership、sleep-system、adaptive-timestepping、units、workspace/collisions 等文档页面。