Roblox Studioで自動車や航空機などの車両を開発するには、PGS(Projected Gauss-Seidel)物理ソルバーの挙動を深く理解する必要があります。旧式のBodyMovers(BodyGyro, BodyVelocity)を使うと、マルチプレイ時に激しい同期ズレや衝突バグが発生します。
現代のRoblox物理は制約(Constraints)ベースの設計が主流です。SpringConstraintによる衝撃吸収、CylindricalConstraintによる車軸ガイド、AlignOrientationによる横転復元、そしてNetwork Ownershipの委譲を組み合わせて堅牢な車両を構築する手法を解説します。
1. PGS物理ソルバーとアセンブリ(Assembly)構造
溶接された部品群が単一の物理体として扱われる仕組み:
- アセンブリとRootPriority: Weldで結合されたパーツは1つのアセンブリになります。車台(Chassis)に
RootPriorityを設定し、基準パーツが勝手に切り替わるのを防ぎます。 - CustomPhysicalPropertiesの調整: タイヤの摩擦係数(Friction)を1.5程度に高め、車台の重心を低く保つことで横滑りや横転を抑えます。
- Masslessの活用: スポイラーや座席などの装飾パーツは
Massless = trueに設定して重心の偏りを防止します。
2. SpringConstraintによるサスペンション調整
路面の凹凸に対応する減衰力と剛性のチューニング:
- FreeLengthと伸縮域:
FreeLengthは無負荷時のバネ長です。タイヤが上下に十分ストロークできる余裕を持たせます。 - 剛性(Stiffness)と減衰(Damping): 車重を支えるStiffnessに対し、Dampingはバネの連続的な跳ね返りを抑えます。
- CylindricalConstraintとの併用: 各バネに円筒制約を組み合わせることで、車輪の横揺れを防ぎ垂直方向の運動のみに拘束します。
3. 最新の動力制約: AlignOrientation & AlignPosition
旧式BodyMoversを刷新するモダンな制約物理:
- BodyMoversの廃止理由: PGSソルバーと干渉し、挙動の乱れや物理負荷の原因になります。
- AlignOrientationによる姿勢制御: 転倒時にロール・ピッチ軸の傾きを自動で水平に戻しつつ、ステアリング(ヨー軸)は自由に保ちます。
- Responsivenessの調整: 15〜30程度の値に設定することで、コーナリング時に自然な車体のロール感を再現できます。
-- 運転者へのネットワークオーナーシップ動的委譲
local VehicleSeat = script.Parent.VehicleSeat
local Chassis = script.Parent.Chassis
VehicleSeat:GetPropertyChangedSignal("Occupant"):Connect(function()
local occupant = VehicleSeat.Occupant
if occupant then
local character = occupant.Parent
local player = game.Players:GetPlayerFromCharacter(character)
if player then
-- 物理計算の所有権を運転者に委譲
local success, err = pcall(function()
Chassis:SetNetworkOwner(player)
end)
if not success then
warn("Network Owner設定エラー:", err)
end
end
else
-- 降車時: 0.2秒後にサーバーへ所有権を返却
task.wait(0.2)
if not VehicleSeat.Occupant then
pcall(function()
Chassis:SetNetworkOwner(nil)
end)
end
end
end)
4. Network Ownershipとマルチプレイの物理遅延解消
ラグによる操作遅れと巻き戻り現象(Rubberbanding)の撲滅:
- サーバー計算の遅延問題: サーバー側で車両を動かすと、通信ラグによりハンドリングがワンテンポ遅れます。
- SetNetworkOwner(player): プレイヤーが運転席に着席した瞬間に
Chassis:SetNetworkOwner(player)を実行し、ローカルの60 FPSで即座に計算させます。 - 不正対策の監視: 異常な速度や座標ワープがないか、サーバー側で定期的に位置検証を行います。
5. CollisionGroupsによる衝突最適化
多人数サーバーでも物理FPSを低下させないコツ:
- グループ分離: 車体、車輪、キャラクターを別グループに分け、車輪と人の当たり判定を切ることで車が宙に吹き飛ぶバグを防ぎます。
- CanTouch/CanQueryの無効化: 内部のバネやシャフトの
CanTouchとCanQueryをオフにして衝突計算負荷を削ります。 - スリープ状態への移行: 車両が無人になった際はネットワーク所有権をサーバー(nil)に戻し、静止時のスリープを促します。
Frequently Asked Questions
マルチプレイで車を運転するとガタガタと引っかかる原因は?
サーバー側で物理計算が行われているためです。乗車時に Chassis:SetNetworkOwner(player) を実行して運転者の端末で即座に計算させてください。
カーブを曲がる際に車が横転しないようにするには?
上部パーツをMasslessにして低重心化を図り、AlignOrientation制約を用いてロール角度を自動復元させます。
SpringConstraintのStiffnessとDampingの推奨バランスは?
DampingをStiffnessの10%〜20%に設定すると、バネが過剰に跳ねることなく安定した減衰が得られます。
なぜBodyVelocityやBodyGyroを使ってはいけないのですか?
旧式オブジェクトは最新のPGSソルバーと競合して挙動が不安定になるためです。AlignOrientationやLinearVelocityへ移行してください。
CollisionGroupsの設定は車両の負荷軽減にどう役立ちますか?
車輪と内部部品、歩行者間の不要な衝突判定を排除し、毎フレーム数百回の接触計算を節約できます。