เพื่อรองรับกลไกทางกายภาพที่ซับซ้อนในขณะที่ยังคงมุ่งหวังประสบการณ์ที่ราบรื่นและตอบสนองต่อผู้เล่น Roblox ฟิสิกส์ ใช้ระบบ ฟิสิกส์แบบกระจาย ซึ่งการคำนวณจะแบ่งเบาภาระระหว่างเซิร์ฟเวอร์และลูกค้าทุกคนที่เชื่อมต่ออยู่ ในระบบนี้ เครื่องยนต์จะกำหนด สิทธิการเชื่อมต่อเครือข่าย ของ BaseParts ที่ถูกจำลองทางกายภาพให้กับลูกค้าหรือเซิร์ฟเวอร์เพื่อแบ่งงานในการคำนวณฟิสิกส์
ลูกค้าจะได้รับประสบการณ์ฟิสิกส์ที่ ตอบสนองมากกว่า กับชิ้นส่วนที่พวกเขาเป็นเจ้าของ เนื่องจากไม่มีความล่าช้าจากการสื่อสารกับเซิร์ฟเวอร์ สิทธิการเชื่อมต่อเครือข่ายยังช่วยปรับปรุงประสิทธิภาพของเซิร์ฟเวอร์เพราะการคำนวณฟิสิกส์สามารถถูกแบ่งเบาให้กับลูกค้าแต่ละคน ทำให้เซิร์ฟเวอร์สามารถให้ความสำคัญกับงานอื่น ๆ ได้
สิทธิการเป็นเจ้าของ BasePart
ตามค่าเริ่มต้น เซิร์ฟเวอร์จะถือกรรมสิทธิ์ของ BasePart ใด ๆ นอกจากนี้ เซิร์ฟเวอร์ จะถือกรรมสิทธิ์ ใน BaseParts ที่ถูกตรึงและคุณไม่สามารถเปลี่ยนแปลงกรรมสิทธิ์ของพวกเขาได้ด้วยตนเอง
ตามความสามารถของฮาร์ดแวร์ของลูกค้าและความใกล้ชิดของ Player.Character ของผู้เล่นกับ BasePart ที่ไม่ถูกตรึง เครื่องยนต์จะกำหนดกรรมสิทธิ์ของชิ้นส่วนดังกล่าวให้กับลูกค้าโดยอัตโนมัติ ดังนั้น ชิ้นส่วนที่อยู่ใกล้ตัวละครของผู้เล่นจึงมีแนวโน้มที่จะกลายเป็นของผู้เล่นมากกว่า
สิทธิการเป็นเจ้าของ Assembly
หากกลไกทางกายภาพไม่มีชิ้นส่วนที่ถูกตรึง การ ตั้งกรรมสิทธิ์ ใน assembly ภายในกลไกนั้นจะตั้งกรรมสิทธิ์เดียวกันสำหรับ ทุก assembly ในกลไก
หากคุณตรึง assembly เดียวที่ ไม่ เป็นส่วนหนึ่งของกลไกที่กว้างขึ้น กรรมสิทธิ์จะกลายเป็นของเซิร์ฟเวอร์ เนื่องจากเซิร์ฟเวอร์จะถือกรรมสิทธิ์ใน BaseParts ที่ถูกตรึง เมื่อทำการปลดตรึง assembly เดิม สถานะกรรมสิทธิ์ก่อนหน้านี้จะสูญหายและถูกส่งกลับไปยังการจัดการโดยอัตโนมัติของเครื่องยนต์
ถ้าคุณตรึง assembly หนึ่งภายในกลไกที่กว้างขึ้นของ assemblies กรรมสิทธิ์จะกลายเป็นของเซิร์ฟเวอร์ แต่กรรมสิทธิ์ของ assemblies อื่น ๆ จะยังคงไม่เปลี่ยนแปลง การปลดตรึง assembly เดิมจะส่งกลับกรรมสิทธิ์ที่ตั้งไว้ก่อนหน้านี้
การตั้งกรรมสิทธิ์
ในเกมที่มีการโต้ตอบฟิสิกส์ที่ซับซ้อนหรือในกรณีที่คุณต้องการมอบการควบคุมโดยตรง คุณสามารถตั้งกรรมสิทธิ์ได้ผ่านการเรียกจากเซิร์ฟเวอร์ไปยัง BasePart:SetNetworkOwner()
พิจารณารถยนต์ที่มีวัตถุ VehicleSeat สำหรับคนขับและวัตถุ Seat สำหรับผู้โดยสาร โดยทั้งสองรวมอยู่ใน assembly ของรถยนต์ ด้วยกฎกรรมสิทธิ์เริ่มต้น หากตัวละครผู้เล่นนั่งใน Seat (ผู้โดยสาร) แล้วผู้เล่นอีกคนกระโดดเข้าไปใน VehicleSeat (คนขับ) ผู้โดยสารจะได้รับกรรมสิทธิ์ทางกายภาพของรถยนต์ทั้งหมดเพราะพวกเขาเข้าไปก่อน คนขับจะต้องรอหลายรอบเครือข่ายก่อนที่ข้อมูลของพวกเขาจะถูกรับรู้ และรถยนต์จะรู้สึกตอบสนองน้อยลง
Script ต่อไปนี้จะแก้ไขปัญหานี้โดยการกำหนดกรรมสิทธิ์เครือข่ายให้กับคนขับ ในสคริปต์นี้ VehicleSeat จะตั้งค่า Occupant ให้กับ Humanoid ที่นั่งอยู่บนมัน ดังนั้นสคริปต์จึงฟังเหตุการณ์ Changed ของที่นั่ง เพื่อจับเหตุการณ์เมื่อผู้เล่นนั่งในที่นั่ง เมื่อคนขับออกจากที่นั่ง กรรมสิทธิ์เครือข่ายของรถจะถูกส่งกลับไปยังการควบคุมโดยอัตโนมัติด้วย BasePart:SetNetworkOwnershipAuto()
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 ทำให้มันผ่านกำแพงหรือบินไปรอบ ๆ
นอกจากนี้ เหตุการณ์ BasePart.Touched จะถูกผูกกับกรรมสิทธิ์เครือข่าย หมายความว่าลูกค้าสามารถเรียกเหตุการณ์ Touched บน BasePart ที่พวกเขาเป็นเจ้าของและส่งไปยังเซิร์ฟเวอร์ แม้ว่าเซิร์ฟเวอร์จะไม่เห็นการสัมผัสกับสิ่งใดก็ตาม ตัวอย่างเช่น ลูกค้าสามารถทำให้ดาบสร้างความเสียหายให้กับผู้เล่นคนอื่นทั่วแผนที่โดยการเรียกเหตุการณ์ผ่านการฉีดสคริปต์ ดังนั้นจึงสำคัญที่ต้องตรวจสอบความถูกต้องของเหตุการณ์เหล่านี้ที่ถูกเรียกโดยลูกค้า
ดูที่ กลยุทธ์ด้านความปลอดภัยและการลดการโกง สำหรับกลยุทธ์ด้านความปลอดภัยที่ละเอียดและกลยุทธ์การลดการโกงสำหรับเกม Roblox