mcpField
R
roblox-physics

roblox-physics

github.com/nonlooped开发25343 次安装2 周前更新
代码仓库

关于 roblox-physics

roblox-physics 是面向 Roblox 开发者的物理系统参考技能,涵盖装配体、约束、碰撞与网络所有权。它还提供常见问题排查、性能调优和示例脚本指导。

主要功能

  1. 01装配体与锚定策略
  2. 02机械约束和运动约束
  3. 03碰撞过滤配置
  4. 04网络所有权与安全
  5. 05物理步进和休眠调优
  6. 06车辆、门和平台脚本示例

适用场景

  1. 01搭建车辆、门或悬挂机构
  2. 02将 BodyMover 迁移到现代约束
  3. 03排查多人游戏中的物理延迟
  4. 04分析物理性能与休眠状态

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/nonlooped/roblox-suite --skill roblox-physics

安装后在 Claude Code 中输入/roblox-physics确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
collisions-and-filtering.md
mechanical-constraints.md
mover-constraints.md
network-ownership.md
units-and-physical-properties.md
scripts/
DoorHinge.lua
PlatformMover.lua
Suspension.lua
VehicleController.lua

详细介绍

roblox-physics

官方来源:

使用机械约束连接零件,使用移动约束施加力或设定速度目标。对于较旧的代码,请参阅下方的 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 的现代替代方案:

旧版现代使用场景
BodyPositionAlignPosition将附件移动到某个位置或另一个附件处
BodyGyroAlignOrientation对齐方向;使用 LookAtPosition 进行追踪
BodyVelocityLinearVelocity沿向量/直线/平面保持恒定速度
BodyAngularVelocityAngularVelocity保持恒定角速度
BodyForce/BodyThrustVectorForce施加恒定力
RocketPropulsionLineForce + 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 stud28 cm
1 RMU21.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 的弹簧阻尼悬架。

后续步骤

  1. 判断对象是刚性机构(机械约束)还是由力驱动(Mover 约束)。
  2. 规划装配体、根部件和锚定策略。
  3. 设置网络所有权,以提高多人游戏中的响应速度。
  4. 使用单位和物理属性调整力/速度。
  5. 使用 MicroProfiler 进行性能分析,并查看睡眠/所有权可视化。

参考索引

评论

支持 Markdown