Để hỗ trợ các cơ chế vật lý phức tạp trong khi vẫn hướng tới trải nghiệm mượt mà và phản hồi cho người chơi, engine vật lý của Roblox sử dụng một hệ thống vật lý phân tán trong đó các tính toán được phân phối giữa máy chủ và tất cả các khách hàng kết nối. Trong hệ thống này, engine gán quyền sở hữu mạng của các BaseParts mô phỏng vật lý cho một khách hàng hoặc máy chủ để chia sẻ công việc tính toán vật lý.
Các khách hàng trải nghiệm các tương tác vật lý phản hồi hơn với các phần mà họ sở hữu, vì không có độ trễ từ việc giao tiếp với máy chủ. Quyền sở hữu mạng cũng cải thiện hiệu suất máy chủ vì các tính toán vật lý có thể được phân chia giữa các khách hàng cá nhân, cho phép máy chủ ưu tiên các nhiệm vụ khác.
Quyền sở hữu BasePart
Theo mặc định, máy chủ giữ quyền sở hữu bất kỳ BasePart nào. Thêm vào đó, máy chủ luôn luôn sở hữu các BaseParts đã được neo và bạn không thể thay đổi quyền sở hữu của chúng theo cách thủ công.
Dựa trên khả năng phần cứng của khách hàng và độ gần gũi của Player.Character của người chơi với một BasePart không được neo, engine tự động gán quyền sở hữu của phần đó cho khách hàng. Do đó, các phần gần với nhân vật của người chơi có khả năng cao hơn để trở thành sở hữu của người chơi.
Quyền sở hữu lắp ghép
Nếu một cơ chế dựa trên vật lý không có các phần đã được neo, cài đặt quyền sở hữu trên một lắp ghép trong cơ chế đó sẽ cài đặt cùng quyền sở hữu cho mọi lắp ghép trong cơ chế.
Nếu bạn neo một lắp ghép đơn độc mà không phải là một phần của một cơ chế rộng lớn hơn, quyền sở hữu của nó sẽ thuộc về máy chủ, vì máy chủ luôn sở hữu các BaseParts đã được neo. Khi bạn bỏ neo lắp ghép đó, trạng thái quyền sở hữu trước đó sẽ bị mất và nó sẽ trở lại điều khiển tự động bởi engine.
Nếu bạn neo một lắp ghép trong một cơ chế lắp ghép rộng lớn hơn, quyền sở hữu của nó sẽ thuộc về máy chủ, nhưng quyền sở hữu của các lắp ghép khác sẽ không thay đổi. Bỏ neo lắp ghép đó sẽ quay lại quyền sở hữu trước đó đã được thiết lập.
Cài đặt quyền sở hữu
Trong các trò chơi có tương tác vật lý phức tạp hoặc trong các trường hợp bạn cần chỉ định quyền điều khiển trực tiếp, bạn có thể thiết lập quyền sở hữu thông qua một cuộc gọi bên máy chủ đến BasePart:SetNetworkOwner().
Xem xét một phương tiện có một đối tượng VehicleSeat cho tài xế và một đối tượng Seat cho một hành khách, với cả hai đều được bao gồm trong lắp ghép phương tiện. Với các quy tắc sở hữu mặc định, nếu một nhân vật người chơi ngồi vào Seat (hành khách) và sau đó một người chơi khác nhảy vào VehicleSeat (tài xế), hành khách sẽ chiếm quyền sở hữu vật lý của toàn bộ phương tiện vì họ đã vào trước. Tài xế sẽ phải chờ một vài chu kỳ mạng trước khi đầu vào của họ được nhận diện và phương tiện sẽ cảm thấy ít phản hồi hơn.
Script dưới đây khắc phục điều này bằng cách gán quyền sở hữu mạng một cách thủ công cho tài xế. Trong đó, VehicleSeat thiết lập Occupant của nó cho Humanoid ngồi trên đó, vì vậy kịch bản lắng nghe sự kiện Changed của ghế để bắt khi một người chơi ngồi vào ghế. Khi tài xế rời khỏi ghế, quyền sở hữu mạng của phương tiện sẽ quay về chế độ tự động với 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
-- Lấy người chơi từ nhân vật
local player = Players:GetPlayerFromCharacter(humanoid.Parent)
if player then
vehicleSeat:SetNetworkOwner(player)
end
else
-- Đặt lại quyền sở hữu khi ghế không có người
vehicleSeat:SetNetworkOwnershipAuto()
end
end
end)
Hình dung quyền sở hữu
Để hỗ trợ việc gỡ lỗi quyền sở hữu mạng, Studio có thể vẽ các đường viền màu xung quanh các đối tượng khi thử nghiệm chơi game.
| Màu đường viền | Mô tả | |
|---|---|---|
| (xanh lá) | Khách hàng của bạn sở hữu phần và đang mô phỏng nó. | |
| (đỏ) | Phần nằm trong "khu vực đệm" nơi khách hàng của bạn đang mô phỏng nó nhưng vẫn thuộc về cái gì đó khác. Khách hàng của bạn có thể có quyền sở hữu sau đó, hoặc nó có thể bị từ chối. | |
| (trắng/xám) | Máy chủ hoặc một khách hàng khác sở hữu phần thông qua việc sở hữu mạng tự động hoặc từ việc chỉ định rõ ràng thông qua part:SetNetworkOwner(). | |
| (đen) | Phần không thuộc sở hữu của máy chủ cũng như khách hàng. Vật lý sẽ không được áp dụng cho phần này. | |
Để kích hoạt hình dung quyền sở hữu mạng:
Nhấp vào nút tùy chọn hình dung ở góc trên bên phải của khung nhìn 3D.

Trong menu thả xuống, bật Các chủ sở hữu mạng.
Những mối quan tâm về bảo mật
Roblox không thể xác minh các tính toán vật lý khi một khách hàng có quyền sở hữu đối với một BasePart. Các khách hàng có thể khai thác điều này và gửi dữ liệu xấu đến máy chủ, chẳng hạn như dịch chuyển BasePart, khiến nó đi xuyên tường hoặc bay vòng.
Thêm vào đó, các sự kiện BasePart.Touched gắn liền với quyền sở hữu mạng, có nghĩa là một khách hàng có thể kích hoạt các sự kiện Touched trên một BasePart mà họ sở hữu và gửi nó đến máy chủ, ngay cả khi máy chủ không thấy nó chạm vào bất kỳ thứ gì. Ví dụ, một khách hàng có thể làm cho một thanh kiếm gây sát thương cho một người chơi khác trên bản đồ bằng cách kích hoạt sự kiện thông qua các tiêm mã, vì vậy điều quan trọng là phải kiểm tra tính hợp lệ của các sự kiện như vậy được kích hoạt bởi các khách hàng.
Xem Chiến thuật Bảo mật và Giảm thiểu Gian lận để biết các chiến thuật bảo mật chi tiết và chiến thuật giảm thiểu gian lận cho các trò chơi Roblox.