Untuk mendukung mekanisme fisik kompleks sambil juga menargetkan pengalaman lancar dan responsif bagi pemain, mesin fisika Roblox menggunakan sistem fisika terdistribusi di mana perhitungan didistribusikan antara server dan semua klien yang terhubung.Dalam sistem ini, mesin menugaskan kepemilikan jaringan dari fisik disimulasikan ke klien atau server untuk membagi pekerjaan menghitung fisika.
Klien mengalami lebih responsif interaksi fisik dengan bagian yang mereka memiliki, karena tidak ada kelambatan dari komunikasi dengan server.Kepemilikan jaringan juga meningkatkan kinerja server karena perhitungan fisika dapat dibagi di antara klien individu, memungkinkan server untuk memprioritaskan tugas lain.
Kepemilikan Bagian Dasar
Secara default, server mempertahankan kepemilikan dari BasePart.Selain itu, server selalu memiliki terikat BaseParts dan Anda tidak dapat secara manual mengubah kepemilikannya.
Berdasarkan kapasitas hardware klien dan kedekatan pemain Player.Character terhadap bagian yang tidak diikat BasePart, mesin secara otomatis menugaskan kepemilikan bagian itu kepada klien.Dengan demikian, bagian yang dekat dengan karakter pemain lebih mungkin menjadi milik pemain.
Kepemilikan kumpulan
Jika mekanisme berbasis fisika tidak memiliki bagian yang diikat, menetapkan kepemilikan pada kumpulan assemble dalam mekanisme tersebut menetapkan kepemilikan yang sama untuk setiap assemble dalam mekanisme.
Jika Anda mengaitkan kumpulan tunggal yang bukan bagian dari mekanisme yang lebih luas, kepemilikannya pergi ke server, karena server selalu memiliki yang diberikan BaseParts .Setelah melepaskan kumpulan yang sama, status kepemilikan sebelumnya hilang dan kembali ke penanganan otomatis oleh mesin.
Jika Anda mengaitkan satu kumpulan dalam mekanisme kumpulan yang lebih luas, kepemilikannya pergi ke server, tetapi kepemilikan kumpulan lainnya tetap tidak berubah.Menyingkirkan asamblasi yang sama membalikkan kepemilikan yang sebelumnya ditetapkan.
Mengatur kepemilikan
Dalam pengalaman dengan interaksi fisika kompleks atau dalam kasus di mana Anda perlu menugaskan kontrol langsung, Anda dapat mengatur kepemilikan melalui panggilan sisi server ke BasePart:SetNetworkOwner() .
Pertimbangkan kendaraan yang memiliki objek VehicleSeat untuk pengemudi dan objek Seat untuk penumpang, keduanya termasuk dalam pengumpulan kendaraan.Dengan aturan kepemilikan default, jika karakter pemain duduk di Seat (penumpang) dan kemudian pemain lain melompat ke VehicleSeat (pengemudi), penumpang mendapatkan kepemilikan fisik seluruh kendaraan karena mereka masuk lebih dulu.Pengemudi harus menunggu beberapa siklus jaringan sebelum input mereka diakui dan kendaraan akan terasa kurang responsif.
Perbaikan berikut Script memperbaiki ini dengan secara manual memberikan kepemilikan jaringan kepada pengemudi.Di dalamnya, VehicleSeat menetapkan Occupant ke Humanoid di atasnya, sehingga skrip mendengarkan peristiwa kursi Changed untuk menangkap saat pemain duduk di kursi.Saat pengemudi meninggalkan kursi, kepemilikan jaringan kendaraan dikembalikan ke otomatis dengan 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
-- Dapatkan pemain dari karakter
local player = Players:GetPlayerFromCharacter(humanoid.Parent)
if player then
vehicleSeat:SetNetworkOwner(player)
end
else
-- Atur ulang kepemilikan saat kursi tidak ditempati
vehicleSeat:SetNetworkOwnershipAuto()
end
end
end)
Menggambarkan kepemilikan
Untuk membantu dalam debugging kepemilikan jaringan, Studio dapat menampilkan garis berwarna di sekitar objek saat pengujian.
Warna garis besar | Deskripsi | |
---|---|---|
(hijau) | Klien Anda memiliki bagian dan menyimpulkannya. | |
(merah) | Bagiannya berada di "zona buffer" di mana klien Anda menyimpannya tetapi masih dimiliki oleh sesuatu yang lain.Klien Anda mungkin mendapatkan kepemilikan setelah ini, atau mungkin menolak. | |
(putih/abu-abu) | Server atau klien lain memiliki bagian melalui kepemilikan jaringan otomatis atau dari penugasan eksplisit melalui part:SetNetworkOwner(). |
Untuk mengaktifkan visualisasi kepemilikan jaringan:
Klik tombol opsional visualisasi di sudut kanan atas tampilan 3D.
Di menu dropdown, beralih pada pemilik jaringan .
Kekhawatiran keamanan
Roblox tidak dapat memverifikasi perhitungan fisika saat klien memiliki kepemilikan atas BasePart .Klien dapat memanfaatkan ini dan mengirim data buruk ke server, seperti teleportasi BasePart, membuatnya melewati dinding atau terbang di sekitar.
Selain itu, peristiwa terikat pada kepemilikan jaringan, yang berarti bahwa klien dapat menembakkan peristiwa di jaringan yang dimilikinya dan mengirimkannya ke server, bahkan jika server tidak melihatnya menyentuh apa pun.Sebagai contoh, klien dapat menimbulkan kerusakan pada pedang ke pemain lain di peta dengan menembakkan peristiwa melalui suntikan skrip, jadi penting untuk memeriksa validitas peristiwa seperti itu yang ditembakkan oleh klien.
Lihat Taktik Keamanan dan Penghindaran Penipuan untuk taktik keamanan dan penghindaran penipuan terperinci untuk pengalaman Roblox.