roblox-physics について
roblox-physicsは、アセンブリ、拘束、衝突、ネットワーク所有権を扱うRoblox開発者向けの物理リファレンススキルです。問題の調査や性能調整、サンプルスクリプトについても説明します。
主な機能
- 01アセンブリとアンカーの方針
- 02機械拘束とムーバー拘束
- 03衝突フィルターの設定
- 04ネットワーク所有権とセキュリティ
- 05物理ステップとスリープの調整
- 06車両・ドア・プラットフォームの例
活用シーン
- 01車両、ドア、サスペンション機構の構築
- 02BodyMoverコードの最新拘束への移行
- 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 移行表を使用してください。
コアコンセプト
アセンブリ
アセンブリとは、剛体溶接または可動ジョイントで接続され、単一の剛体としてシミュレーションされる1つ以上のパーツです。
主な BasePart プロパティ(アセンブリ内のすべてのパーツで共通):
AssemblyLinearVelocity/AssemblyAngularVelocity:現実的な動きには、直接代入するよりも制約またはApplyImpulseを使用してください。AssemblyCenterOfMass:ここに力を加えると、純粋な線形加速度が発生します。AssemblyMass:すべてのパーツの質量の合計です。パーツが1つでも固定されている場合は無限になります。AssemblyRootPart:レプリケーションとネットワーク所有権のために、自動的に選択されるルートです。
ルートパーツの優先順位:固定されているパーツ > 質量なしではないパーツ > より高い RootPriority > サイズ/名前による判断基準。
固定
- アセンブリ内のパーツを1つ固定すると、そのパーツがルートになり、残りのパーツも暗黙的に固定されます。
- 同じアセンブリ内の複数のパーツを固定すると、アセンブリが分割されます。
- アセンブリ全体を固定するには、ルートパーツのみを固定してください。
衝突フィルタリング
パーツ同士のフィルタリングには、衝突グループ(Workspace:RegisterCollisionGroup(WorldRoot から継承)、BasePart.CollisionGroup)または NoCollisionConstraint を使用します。CanCollide、CanTouch、CanQuery はそれぞれ異なる動作を制御します。詳しくは references/collisions-and-filtering.md を参照してください。
メカニカル制約
WeldConstraint と NoCollisionConstraint は Part0/Part1 を使用し、それ以外のすべてのメカニカル制約は1つまたは2つの Attachment(または Bone)を接続します。
| 制約 | 用途 |
|---|---|
WeldConstraint | 2つのパーツを同じ相対位置・姿勢で剛体的に固定します |
RigidConstraint | WeldConstraint と同様ですが、Attachment ベースで、ボーンをサポートします |
HingeConstraint | ドア、レバー、回転パーツ。モーター/サーボは任意です |
PrismaticConstraint | 引き戸、エレベーター、ピストン |
CylindricalConstraint | 油圧ラムや着陸装置のように、スライドと回転を行います |
SpringConstraint | スプリング、ショック、サスペンション |
TorsionSpringConstraint | 回転スプリング |
BallSocketConstraint | 肩、ボールジョイント |
UniversalConstraint | ドライブシャフト、等速ジョイント |
RopeConstraint | ケーブル、ウインチ、最大長 |
RodConstraint | 距離を一定に保ちます |
PlaneConstraint | 運動を平面上に制限します |
NoCollisionConstraint | 特定の2つのパーツ間の衝突を無効にします |
作成方法、向き、モーター/サーボの調整、制限については references/mechanical-constraints.md を参照してください。
Mover 制約
非推奨の BodyMover に代わる、最新の制約です。
| 旧式 | 最新 | 用途 |
|---|---|---|
BodyPosition | AlignPosition | アタッチメントを位置、または別のアタッチメントへ移動させます |
BodyGyro | AlignOrientation | 向きを合わせます。追跡には LookAtPosition を使用します |
BodyVelocity | LinearVelocity | ベクトル、直線、平面に沿って一定の速度を維持します |
BodyAngularVelocity | AngularVelocity | 一定の角速度を維持します |
BodyForce/BodyThrust | VectorForce | 一定の力を加えます |
RocketPropulsion | LineForce + AlignOrientation | ターゲットを追従し、向きを合わせます |
| - | Torque | 一定のトルクを加えます |
| - | LineForce | 2つのアタッチメント間の直線に沿って力を加えます |
| - | AnimationConstraint | アニメーション/トランスフォームで駆動される制約です |
力のモード(Magnitude と PerAxis)、相対性フレーム、剛性、反力については、references/mover-constraints.md を参照してください。
ネットワーク所有権
- アンカーされたパーツはサーバーが所有します。
- プレイヤーキャラクターの近くにあるアンカーされていないパーツは、そのクライアントが自動的に所有します。
BasePart:SetNetworkOwner(player)を使って所有権を明示的に設定します(サーバーのみ)。SetNetworkOwnershipAuto()でリセットします。- 車両/ドライバーの所有権は慎重に割り当ててください。そうしないと、最初に着席したプレイヤーがアセンブリ全体を所有する場合があります。
セキュリティ: クライアントは所有するパーツを悪用できます(テレポート、偽の衝突など)。ゲームプレイ上重要なイベントはサーバー側で検証してください。references/network-ownership.md を参照してください。
スリープシステム
アセンブリはパフォーマンスを節約するため、静止するとシミュレーションを停止します。衝突、プロパティの変更、インパルス、重力/風の変化によって再び動作します。
- 低速の機構がスリープ状態になる場合は、動きを大きくするか、より厳しいスリープしきい値が設定された駆動ジョイント(モーター/サーボ制約)を使用してください。
- Studio の可視化オプションにある 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:質量、密度、摩擦、力、またはシミュレーションのステップ間隔を調整します。