Roblox の 物理メカニズム エンジンは、プレイヤーにとってスムーズで応答性の高いエクスペリエンスを提供するために、配置物理学システムを使用しています。このシステムでは、エンジンはサーバーとすべての接続
クライアントは、サーバーとの通信に遅延がないので、 より応答性の高い 物理的なインタラクションを持つパーツを所有することで、より多くのレスポンスを得ます。ネットワーク所有は、サーバーとの通信に遅延がないため、物理計算を個々のクライアント間に分割することで、サーバーのパフォーマンスを最大限に向上させます。
ベースパート所有済み
デフォルトでは、サーバーは BasePart の所有権を保持します。さらに、サーバーは Class.BasePart|BaseParts にアンカー付き BaseParts を常に所有しています。これらの所有権を手動で変更することはできません。
クライアントのハードウエア容量とプレイヤーの Player.Character の近接に基づいて、エンジンは自動的にそのパーツの所有権をクライアントに割り当てます。つまり、プレイヤーのキャラクターの近くにあるパーツは、より可能性が高いプレイヤーが所有する可能性があります。
アセンブリ所有済み
物理ベースのメカニズムにはアンカー部分がない場合、所有権を設定することで、そのメカニズム内のすべてのアセンブリに同じ所有権を設定します。
孤立したアセンブルは、 機能の拡張部分ではない 場合、その所有はサーバーに移ります。サーバーは常にアンカーされた BaseParts の上に錠定されているので、同じアセンブルをアンカーした場合、その前の所有状態は失われ、エンジンによって自動処理されます。
アセンブルを拡張されたアセンブルのメカニズムの中にアンカーする場合、その所有はサーバーに移行しますが、他のアセンブルの所有は変更されません。同じアセンブルをアンアンチャーすると、以前に設定された所有が戻ります。
所有権を設定する
複雑な物理のインタラクションを有効にするか、直接コントロールを割り当てる必要がある場合は、 BasePart:SetNetworkOwner() サーバー側のコールで所有者を設定できます。
Class.VehicleSeat オブジェクト を持つ車両は、Seat を持つ車両のドライバーと
次の Script は、VehicleSeat をマニュアルでネットワークの所有者に割り当てること
local Players = game:GetService("Players")
local vehicleSeat = script.Parent
vehicleSeat.Changed:Connect(function(prop)
if prop == "Occupant" then
local humanoid = vehicleSeat.Occupant
if humanoid then
-- キャラクターからプレイヤーを取得する
local player = Players:GetPlayerFromCharacter(humanoid.Parent)
if player then
vehicleSeat:SetNetworkOwner(player)
end
else
-- 座席が空っぽの時に所有者をリセットする
vehicleSeat:SetNetworkOwnershipAuto()
end
end
end)
所有権を表示する
ネットワークの所有者デバッグを助力するために、Studio はプレイテストでオブジェクトの周りに色付きのアウトラインを表示できます。
アウトラインの色 | 説明 | |
---|---|---|
(緑) | あなたのクライアントはパーツを所有しており、シミュレートしています。 | |
(赤) | パーツは「バッファーゾーン」内にあり、クライアントはシミュレートしていますが、それはまだ別のものの所有です。あなたのクライアントは、この後に所有権を得るかもしれません、またはそれを拒否するかもしれません。 | |
(白/グレー) | サーバーまたは他のクライアントがパートを自動ネットワーク所有または明示的な割り当てを通じて所有しています。part:SetNetworkOwner() 。 |
ネットワーク所有ビジュアル化を有効にするには:
3D ビューポートの右上隅にある ビジュアルオプション ボタンをクリックします。
ドロップダウンメニューで、 ネットワーク所有者 をオン/オフします。
セキュリティの懸念
Roblox は、BasePart の所有者が BasePart の物理計算を検証できません。クライアントは、これを悪用して、クライアントが Class.BasePart の上にある物理計算を実行し、壁を通過したり、1>Class.BasePart1> の上に飛行したりするなど、不正なデータをサーバーに送信できます。
さらに、BasePart.Touched イベントは、ネットワーク所有権に縛られています。つまり、クライアントは Class.BasePart.Touched|Touched イベントを発射する Class.BasePart
Roblox エクスペリエンスの詳細なセキュリティ戦略とチートミッティング戦略については、Security Tactics and Cheat Mitigation を参照してください。