Membangun kendaraan yang mulus di Roblox Studio memerlukan pemahaman tentang solver PGS (Projected Gauss-Seidel). Menggunakan BodyMovers lawas menyebabkan getaran parah dan desinkronisasi di server ramai.
Fisika Roblox modern berlandaskan batasan (Constraints): SpringConstraints untuk suspensi empuk, CylindricalConstraints untuk poros roda, AlignOrientation anti-terguling, dan pelimpahan Network Ownership.
1. Solver Fisika PGS & Arsitektur Perakitan (Assembly)
Bagaimana bagian-bagian yang dilas menjadi satu benda padat:
- Assembly dan RootPriority: Bagian yang dilas menjadi satu Assembly. Tentukan
RootPrioritypada sasis utama. - CustomPhysicalProperties: Gesekan ban tinggi (1.5) dan sasis berpusat massa rendah mencegah mobil tergelincir.
- Fitur Massless: Pasang
Massless = truepada dekorasi agar tidak mengacaukan titik berat kendaraan.
2. Mekanisme Suspensi dengan SpringConstraints
Peredaman guncangan di berbagai medan:
- FreeLength vs CurrentLength:
FreeLengthadalah panjang rileks pegas demi ruang gerak roda. - Kekakuan (Stiffness) & Redaman (Damping): Stiffness menopang beban, Damping meredam pantulan tiada henti.
- Pemandu CylindricalConstraint: Membatasi roda agar hanya bergerak vertikal tanpa goyangan horizontal.
3. Penggerak Modern: AlignOrientation & AlignPosition
Menggantikan BodyMovers lama dengan gaya berbasis batasan:
- Alasan BodyMovers Usang: Bertabrakan dengan solver PGS dan memicu lonjakan lag.
- AlignOrientation Anti-Terguling: Menegakkan kembali sasis yang miring tanpa membatasi belokan setir.
- Pengaturan Responsiveness: Angka 15–30 memberikan kemiringan bodi yang realistis saat menikung tajam.
-- Pelimpahan Dinamis Network Ownership ke Pengemudi
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
-- Serahkan simulasi fisika ke pengemudi
local success, err = pcall(function()
Chassis:SetNetworkOwner(player)
end)
if not success then
warn("Gagal menetapkan Network Owner:", err)
end
end
else
-- Pengemudi keluar: kembalikan ke server
task.wait(0.2)
if not VehicleSeat.Occupant then
pcall(function()
Chassis:SetNetworkOwner(nil)
end)
end
end
end)
4. Network Ownership & Mengatasi Lag Fisika Multiplayer
Menghilangkan efek tersendat (rubberbanding) saat menyetir:
- Masalah Latensi: Simulasi di server membuat setir terasa lambat dan telat merespons.
- SetNetworkOwner(player): Saat pemain duduk, panggil
Chassis:SetNetworkOwner(player)untuk simulasi lokal 60 FPS. - Pengawasan Server: Pantau koordinat secara berkala untuk mencegah kecurangan teleportasi.
5. CollisionGroups & Efisiensi Fisika Server
Menjaga 60 FPS tetap mulus di server berkapasitas besar:
- Pemisahan Grup Tabrakan: Matikan tabrakan antara roda dan pejalan kaki agar mobil tidak terpental liar.
- Nonaktifkan CanTouch / CanQuery: Matikan fitur ini pada komponen mekanis dalam mobil.
- Kondisi Tidur (Sleep): Kembalikan Network Ownership ke server (nil) saat mobil ditinggalkan.
Frequently Asked Questions
Mengapa mobil saya tersendat saat dikendarai di multiplayer?
Karena fisika disimulasikan di server. Panggil Chassis:SetNetworkOwner(player) agar kendali diproses di klien tanpa lag.
Bagaimana cara mencegah mobil terguling di tikungan tajam?
Jadikan bagian atas mobil Massless agar pusat gravitasi turun, dan pasang AlignOrientation.
Berapa perbandingan ideal antara Stiffness dan Damping?
Damping biasanya disetel sekitar 10% hingga 20% dari nilai Stiffness untuk meredam ayunan berlebih.
Mengapa BodyVelocity dan BodyGyro tidak boleh digunakan lagi?
Keduanya sudah usang dan berkonflik dengan solver PGS. Gunakan AlignOrientation atau LinearVelocity.
Apa fungsi CollisionGroups untuk performa kendaraan?
Meniadakan kalkulasi tabrakan yang tak perlu antara roda dan onderdil internal, menghemat beban CPU.