关于 roblox-physics
roblox-physics 是面向 Roblox 开发者的技能,涵盖装配体、约束、碰撞、查询和网络所有权。它帮助区分物理模拟、角色控制、命中检测与视觉运动,以选择合适的实现方式。
主要功能
- 01选择模拟或查询方式
- 02配置碰撞与查询策略
- 03应用装配体力和约束
- 04管理网络所有权
- 05控制查询成本与资源生命周期
- 06验证多人环境下的物理表现
适用场景
- 01替换不可靠的触碰式命中检测
- 02排查抖动或卡住的机制
- 03构建由力或约束驱动的运动
- 04验证客户端所有物理的游戏影响
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ gamedev-skills/ awesome-gamedev-agent-skills --skill roblox-physics安装后在 Claude Code 中输入/roblox-physics确认已加载。
附带文件agents/openai.yamlreferences/queries-and-ownership.md
详细介绍
Roblox 物理
在模拟、角色控制、命中检测和纯视觉运动之间谨慎选择;
它们是不同的任务。面向 Roblox 正在推出的平台 API。搭配 physics-tuning 使用,可获得与引擎无关的稳定性和手感。
适用场景
- 用于 BasePart 装配体、约束、碰撞/查询策略、射线/重叠查询、力、冲量、移动的物理对象、网络所有权或物理清理。
Touched不可靠或存在安全风险、部件穿透或抖动、机构在锚定后失效,或出现旧式 BodyMover 用法时使用。
不适用场景: 普通 Humanoid 生命周期/控制属于 roblox-characters;远程验证属于 roblox-networking;装饰性 UI/世界运动可能只需要补间。
首先确定系统
| 目标 | 机制 |
|---|---|
| 持续的物理交互 | 未锚定的装配体 + 现代约束/力 |
| 瞬时物理变化 | ApplyImpulse / ApplyAngularImpulse |
| 运动学平台/路径 | 受控枢轴/变换,并明确乘客策略 |
| 角色移动 | Humanoid/自定义角色控制器(roblox-characters) |
| 权威命中检测 | 使用过滤器和游戏逻辑验证的服务器射线投射/重叠查询 |
| 装饰性拖尾/后坐力 | 本地视觉运动;不具备游戏逻辑权威性 |
工作流
- 检查机构。 在 Studio 中可视化装配体、锚点、约束、碰撞组、无质量部件和网络所有者。确定装配体根部及预期的权威方。
- 定义交互策略。 编写碰撞组矩阵,并分别决定
CanCollide、CanTouch和CanQuery。这些标志不可互换。 - 选择模拟或查询。 不要把
.Touched当作通用命中检测器。对路径/直线使用射线,对体积使用重叠查询;只有确实需要物理响应时才使用模拟接触。 - 在装配体级别施加运动。 施加在部件上的力会影响其所属装配体。酌情使用现代
LinearVelocity、AngularVelocity、VectorForce、AlignPosition和AlignOrientation约束;修改该系统时,迁移弃用的 BodyMover。 - 有意设置所有权。 必要时,让服务器拥有对游戏玩法至关重要的松散装配体;客户端所有权可提高响应速度,但绝不能作为游戏逻辑结果的授权依据。
- 限制成本和生命周期。 重用查询参数,限制查询频率/结果数量,移除临时约束/附件,并断开事件监听器。
- 在负载和多人环境下验证。 测试锚定/取消锚定转换、极端质量、碰撞矩阵、快速运动、多个客户端、所有权变更、流式加载和清理。
模式:带过滤的服务器射线投射
local Workspace = game:GetService("Workspace")
local params = RaycastParams.new()
params.FilterType = Enum.RaycastFilterType.Exclude
params.FilterDescendantsInstances = {shooterCharacter}
params.IgnoreWater = true
params.CollisionGroup = "WeaponQuery"
local direction = aimDirection.Unit * MAX_RANGE
local result = Workspace:Raycast(muzzlePosition, direction, params)
if result then
local model = result.Instance:FindFirstAncestorOfClass("Model")
local humanoid = model and model:FindFirstChildOfClass("Humanoid")
if humanoid and serverCanDamage(shooter, model, result.Position) then
humanoid:TakeDamage(serverWeaponDamage(shooter))
end
end
服务器必须根据服务器已知的角色/武器状态验证起点和方向;不要接受任意客户端起点,并把射线投射本身视为验证。
模式:明确策略的重叠体积
local params = OverlapParams.new()
params.FilterType = Enum.RaycastFilterType.Exclude
params.FilterDescendantsInstances = {sourceCharacter}
params.CollisionGroup = "DamageQuery"
params.MaxParts = 64
local seen: {[Model]: boolean} = {}
for _, part in Workspace:GetPartBoundsInBox(hitboxCFrame, hitboxSize, params) do
local model = part:FindFirstAncestorOfClass("Model")
if model and not seen[model] then
seen[model] = true
validateAndApplyHit(model)
end
end
边界查询使用包围盒,可能包含同一目标的多个部件;请按需去重并执行精确/游戏逻辑检查。若要使用精确几何,仅在额外开销合理时使用 WorldRoot:GetPartsInPart(part, overlapParams)。请注意,OverlapParams.RespectCanCollide 决定查询遵循 CanCollide 还是 CanQuery——应有意设置此项,否则它会悄然覆盖下方的标志策略。OverlapParams.Tolerance 控制接触容差。
装配体、力与所有权
- 焊接的部件会组成一个刚性装配体;力、冲量、速度、质量和所有权均作用于该装配体。锚定部件会改变模拟和所有权,并可能使装配体的质量实际上变为无限。
- 一次性改变状态时使用冲量;需要持续控制时使用力或速度约束。设置
AssemblyLinearVelocity会立即改变状态,并非连续力模型。 - 创建或修改机构时,优先使用附件和现代约束,而不是
BodyPosition、BodyVelocity、BodyGyro及其他已弃用的 BodyMover。 - 自动所有权可能会将附近未锚定的装配体转交给客户端。对关键对象谨慎使用
SetNetworkOwner(nil),然后评估响应速度和服务器成本。在 Studio 中可视化网络所有者。 - 客户端所有者可以操纵物理结果和
.Touched检测结果。服务器会独立验证重要的命中、位置、时机和权限。
常见故障
| 症状 | 可能原因 | 解决方法 |
|---|---|---|
| 焊接机构无法移动 | 一个部件已锚定 | 检查整个装配体;仅锚定有意设为世界根部的部件 |
| 力的效果过强或过弱 | 未考虑装配体质量 | 检查 AssemblyMass;根据预期加速度调整力或冲量 |
| 快速投射物未命中 | 离散触碰采样/穿透 | 使用扫掠查询 — WorldRoot:Blockcast()、Spherecast() 或 Shapecast() — 并结合 physics-tuning;不要只依赖 .Touched |
| 射线命中发射者/特效 | 未设置过滤条件/碰撞组 | 复用明确的参数和查询组 |
| 同一目标受到多次伤害 | 重叠查询返回多个身体部件 | 按目标模型去重,并实施攻击 ID/冷却 |
| 漏洞利用者触发不可能发生的触碰 | 客户端拥有相关物理对象 | 在服务器端查询/验证上下文;谨慎设置所有权 |
| 隐形触发器会阻挡对象或无法查询 | 混淆了三个标志 | 分别设置 CanCollide、CanTouch 和 CanQuery |
| 机构泄漏附件 | 缺少临时约束的生命周期管理 | 一并管理和销毁约束、附件及连接 |
资源
- 阅读
references/queries-and-ownership.md,了解碰撞/查询矩阵、装配体调试、所有权安全、迁移选择和物理验证矩阵。
相关技能
physics-tuning— 时间步长、抖动、穿透、质量比和稳定性方法。roblox-characters— Humanoid/自定义移动和重生生命周期。roblox-networking— 对客户端请求的物理操作进行权威验证。roblox-studio-workflow— 可视化、Output 和多客户端验证。
主要参考资料
https://create.roblox.com/docs/physics/assemblieshttps://create.roblox.com/docs/physics/network-ownershiphttps://create.roblox.com/docs/workspace/raycasting
评论
支持 Markdown