关于 roblox-physics
roblox-physics 是面向 Roblox 开发者的物理系统参考技能,涵盖装配体、约束、碰撞与网络所有权。它还提供常见问题排查、性能调优和示例脚本指导。
主要功能
- 01装配体与锚定策略
- 02机械约束和运动约束
- 03碰撞过滤配置
- 04网络所有权与安全
- 05物理步进和休眠调优
- 06车辆、门和平台脚本示例
适用场景
- 01搭建车辆、门或悬挂机构
- 02将 BodyMover 迁移到现代约束
- 03排查多人游戏中的物理延迟
- 04分析物理性能与休眠状态
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ nonlooped/ roblox-suite --skill roblox-physics安装后在 Claude Code 中输入/roblox-physics确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/collisions-and-filtering.mdmechanical-constraints.mdmover-constraints.mdnetwork-ownership.mdunits-and-physical-properties.mdscripts/DoorHinge.luaPlatformMover.luaSuspension.luaVehicleController.lua详细介绍
roblox-physics
官方来源:
- https://create.roblox.com/docs/physics
- https://create.roblox.com/docs/physics/assemblies
- https://create.roblox.com/docs/physics/mechanical-constraints
- https://create.roblox.com/docs/physics/mover-constraints
- https://create.roblox.com/docs/physics/network-ownership
- https://create.roblox.com/docs/physics/sleep-system
- https://create.roblox.com/docs/physics/adaptive-timestepping
- https://create.roblox.com/docs/physics/units
- https://create.roblox.com/docs/workspace/collisions
使用机械约束连接零件,使用移动约束施加力或设定速度目标。对于较旧的代码,请参阅下方的 BodyMover 迁移表。
核心概念
装配体
装配体是由刚性焊接或可动关节连接的一个或多个零件,并作为单个刚体进行模拟。
BasePart 的关键属性(适用于装配体中的任何零件):
AssemblyLinearVelocity/AssemblyAngularVelocity:为实现逼真的运动,优先使用约束或ApplyImpulse,而不是直接赋值。AssemblyCenterOfMass:在此处施加力会产生纯线性加速度。AssemblyMass:所有零件质量的总和;如果任何零件已锚定,则为无穷大。AssemblyRootPart:为复制和网络所有权自动选择的根零件。
根零件优先级:已锚定 > 非无质量 > 较高的 RootPriority > 基于大小和名称的启发式规则。
锚定
- 锚定装配体中的一个零件会使其成为根;其余零件会隐式锚定。
- 锚定同一装配体中的多个零件会将其拆分。
- 要锚定整个装配体,只需锚定根零件。
碰撞筛选
使用碰撞组(Workspace:RegisterCollisionGroup(继承自 WorldRoot)、BasePart.CollisionGroup)或 NoCollisionConstraint 来筛选零件之间的碰撞。CanCollide、CanTouch 和 CanQuery 控制不同的行为;请参阅 references/collisions-and-filtering.md。
机械约束
除使用 Part0/Part1 的 WeldConstraint 和 NoCollisionConstraint 外,所有机械约束都连接一个或两个 Attachment(或 Bone)。
| 约束 | 用途 |
|---|---|
WeldConstraint | 将两个零件刚性锁定在一起,保持相同的相对变换 |
RigidConstraint | 与 WeldConstraint 相同,但基于附件,并支持骨骼 |
HingeConstraint | 门、杠杆、旋转零件;可选电机/伺服 |
PrismaticConstraint | 滑动门、电梯、活塞 |
CylindricalConstraint | 滑动并旋转,类似液压杆或起落架 |
SpringConstraint | 弹簧、减震器、悬架 |
TorsionSpringConstraint | 旋转弹簧 |
BallSocketConstraint | 肩部、球窝关节 |
UniversalConstraint | 传动轴、等速关节 |
RopeConstraint | 缆绳、绞盘、最大长度 |
RodConstraint | 固定间距 |
PlaneConstraint | 将运动限制在一个平面内 |
NoCollisionConstraint | 禁用两个指定零件之间的碰撞 |
有关创建、方向、电机/伺服调节和限制条件,请参阅 references/mechanical-constraints.md。
Mover 约束
已弃用的 BodyMover 的现代替代方案:
| 旧版 | 现代 | 使用场景 |
|---|---|---|
BodyPosition | AlignPosition | 将附件移动到某个位置或另一个附件处 |
BodyGyro | AlignOrientation | 对齐方向;使用 LookAtPosition 进行追踪 |
BodyVelocity | LinearVelocity | 沿向量/直线/平面保持恒定速度 |
BodyAngularVelocity | AngularVelocity | 保持恒定角速度 |
BodyForce/BodyThrust | VectorForce | 施加恒定力 |
RocketPropulsion | LineForce + AlignOrientation | 跟随目标并朝向目标 |
| - | Torque | 施加恒定扭矩 |
| - | LineForce | 沿两个附件之间的直线施力 |
| - | AnimationConstraint | 由动画/变换驱动的约束 |
有关力模式(Magnitude 与 PerAxis)、相对坐标系、刚性和反作用力,请参阅 references/mover-constraints.md。
网络所有权
- 锚定部件由服务器拥有。
- 玩家角色附近的未锚定部件会自动由该客户端拥有。
- 使用
BasePart:SetNetworkOwner(player)显式设置所有权(仅限服务器)。使用SetNetworkOwnershipAuto()重置。 - 谨慎分配载具/驾驶员所有权:否则,最先就座的玩家可能会拥有整个装配体。
**安全性:**客户端可以利用其拥有的部件进行作弊(传送、伪造碰撞)。请在服务器端验证对游戏至关重要的事件。请参阅 references/network-ownership.md。
睡眠系统
装配体静止时会停止模拟,以节省性能。发生碰撞、属性变化、冲量或重力/风力变化时,它们会被唤醒。
- 如果缓慢运动的机构进入睡眠状态,请增加其运动量,或使用驱动关节(电机/伺服约束),因为它们的睡眠阈值更严格。
- 在 Studio 的 Visualization Options 中使用 Awake parts 可视化睡眠状态。
物理步进方法
Workspace.PhysicsSteppingMethod:
- Fixed(默认,240 Hz):通用场景的最佳选择;适用于竞速、破坏、坦克,或大部分部件本来就以 240 Hz 求解的情况。
- Adaptive:将装配体分配到 60/120/240 Hz 的岛中,在合适的体验中可将性能提升至约 2.5 倍。
使用 MicroProfiler 检查岛的分布。
单位速查
| Roblox | 公制 |
|---|---|
| 1 stud | 28 cm |
| 1 RMU | 21.952 kg |
| 196.2 studs/s² | 默认“Classic”重力 |
| 35 studs/s² | “Realistic”重力(≈ 9.8 m/s²) |
请参阅 references/units-and-physical-properties.md。
常见错误
- 使用已弃用的
BodyMover,而不是现代约束。 - 每帧设置
CFrame,而不是使用力/约束。 - 锚定装配体中的每个部件(会将其拆分并降低性能)。
- 忽略载具的网络所有权,之后却疑惑输入为何会有延迟。
- 信任客户端拥有的部件触发的
Touched事件来判定伤害/权限。 - 任由驱动关节过早进入睡眠状态。
脚本
scripts/VehicleController.lua:使用HingeConstraint转向和电机驱动的底盘设置,包含客户端所有权和服务器验证。scripts/DoorHinge.lua:带有限位和状态机的电机/伺服门。scripts/PlatformMover.lua:带可配置路点的AlignPosition+AlignOrientation平台。scripts/Suspension.lua:使用SpringConstraint的弹簧阻尼悬架。
后续步骤
- 判断对象是刚性机构(机械约束)还是由力驱动(Mover 约束)。
- 规划装配体、根部件和锚定策略。
- 设置网络所有权,以提高多人游戏中的响应速度。
- 使用单位和物理属性调整力/速度。
- 使用 MicroProfiler 进行性能分析,并查看睡眠/所有权可视化。
参考索引
- collisions-and-filtering.md:配置碰撞组、触碰事件或空间查询筛选器。
- mechanical-constraints.md:使用铰链、弹簧、绳索或其他机械约束连接部件。
- mover-constraints.md:施加力或速度目标,或迁移 BodyMover 代码。
- network-ownership.md:将物理模拟分配给服务端或玩家,并调试所有权。
- units-and-physical-properties.md:调整质量、密度、摩擦力、力或模拟步进。