Roblox Studio'da stabil kara ve hava araçları geliştirmek için PGS (Projected Gauss-Seidel) çözücüsünü iyi kavramak gerekir. Eski BodyMovers sınıflarını kullanmak çok oyunculu sunucularda takılmalara yol açar.
Modern Roblox fiziği kısıtlama (Constraint) mimarisine dayanır: Gerçekçi süspansiyon için SpringConstraints, tekerler için CylindricalConstraints, devrilmeyi önleyen AlignOrientation ve dinamik Network Ownership.
1. PGS Çözücüsü ve Montaj (Assembly) Mimarisi
Birbirine kaynaklanmış parçaların tek bir rijit gövde oluşturması:
- Montajlar ve RootPriority: Kaynaklı parçalar tek bir Assembly oluşturur. Gövde parçasının değişmemesi için şasiye
RootPriorityverin. - CustomPhysicalProperties: Yüksek lastik sürtünmesi (1.5) ve düşük ağırlık merkezi savrulmayı önler.
- Massless Özelliği: Koltuk ve kanat gibi süs parçalarını
Massless = trueyaparak dengeyi koruyun.
2. SpringConstraints ile Süspansiyon Ayarı
Farklı arazilerde darbe emilimi sağlama:
- FreeLength vs CurrentLength:
FreeLengthyayın doğal uzunluğudur; tekerin dikey hareketine alan tanır. - Sertlik (Stiffness) ve Sönümleme (Damping): Stiffness ağırlığı taşır, Damping ise sürekli yaylanmayı keser.
- CylindricalConstraint Entegrasyonu: Yana yalpalamayı kesip tekerin sadece dikey eksende çalışmasını sağlar.
3. Modern İticiler: AlignOrientation & AlignPosition
Eski BodyMovers sınıflarının yerini alan modern kuvvetler:
- BodyMovers Neden Bırakıldı: PGS çözücüsüyle çakışarak fiziksel tutarsızlıklara yol açıyordu.
- AlignOrientation ile Doğrulma: Aracın devrilmesini önlerken direksiyon açısını serbest bırakır.
- Responsiveness: 15–30 arası değerler virajlarda gövdenin doğal yatmasını sağlar.
-- Sürücüye Dinamik Network Ownership Devretme
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
-- Fizik simülasyonunu sürücüye devret
local success, err = pcall(function()
Chassis:SetNetworkOwner(player)
end)
if not success then
warn("Network Owner hatası:", err)
end
end
else
-- Sürücü indi: mülkiyeti sunucuya iade et
task.wait(0.2)
if not VehicleSeat.Occupant then
pcall(function()
Chassis:SetNetworkOwner(nil)
end)
end
end
end)
4. Network Ownership ve Çok Oyunculu Fizik Gecikmesi
Işınlanma ve gecikmeli direksiyon tepkilerini engelleme:
- Ping Sorunu: Sunucu tabanlı fizik, gecikme nedeniyle ağır direksiyon hissiyatı yaratır.
- SetNetworkOwner(player): Sürücü oturduğunda
Chassis:SetNetworkOwner(player)çağırarak yerel 60 FPS hesaplamaya geçin. - Hile Denetimi: Sunucuda olağan dışı hız ve koordinat sıçramalarını izleyin.
5. CollisionGroups ve Fizik Optimizasyonu
Kalabalık sunucularda 60 FPS fizik performansını koruma:
- Çarpışma Grupları: Tekerler ve yayaları ayırarak aracın gökyüzüne fırlama hatasını engelleyin.
- CanTouch / CanQuery Kapatma: İç mekanik parçalarda bu özellikleri kapatıp motoru hafifletin.
- Fiziksel Uyku (Sleep): Araç boşaldığında Network Ownership'i sunucuya (nil) devredin.
Frequently Asked Questions
Aracım çok oyunculuda neden takılıyor ve geç tepki veriyor?
Fizik sunucuda hesaplandığı için. Chassis:SetNetworkOwner(player) ile simülasyonu sürücüye devredin.
Aracın virajlarda ters dönmesini nasıl engellerim?
Üst parçaları Massless yaparak ağırlık merkezini düşürün ve AlignOrientation ekleyin.
Stiffness ve Damping oranı nasıl ayarlanmalı?
Damping değeri genelde Stiffness değerinin %10 ila %20'si olarak seçilir.
Yeni projelerde neden BodyVelocity ve BodyGyro kullanılmamalı?
Eski nesil nesneler modern PGS motoruyla çakışır. AlignOrientation veya LinearVelocity kullanın.
CollisionGroups araç performansına nasıl katkı sağlar?
Gereksiz teker ve yaya temas hesaplamalarını keserek işlemci yükünü ciddi oranda hafifletir.