Ragdoll fiziği, Roblox oyunlarında karakter darbelerine ve düşüşlerine dinamik ve eğlenceli bir gerçekçilik katar. Ancak optimize edilmemiş sistemler titremelere ve karakterin harita dışına düşmesine yol açar.
Sorunsuz bir sistem için BallSocketConstraints ile açı sınırları belirlemek, NoCollisionConstraints ile iç çarpışmaları engellemek ve NetworkOwnership ayarlarını doğru yapmak şarttır.
1. Motor6D Değişimi ve BallSocketConstraint Açı Sınırları
Animasyon eklemlerini fiziksel mafsallarla dinamik olarak değiştirme temeli:
- Motor6D Devre Dışı Bırakma: Karakterin sonradan ayağa kalkabilmesi için Motor6D nesnelerini silmeyin, sadece Enabled = false yapın.
- Açısal Kısıtlamalar: LimitsEnabled ve TwistLimitsEnabled ayarlarını açarak uzuvların 360 derece yapay şekilde bükülmesini engelleyin.
- Attachment Hazırlığı: Oyun içi donmaları önlemek için bağlantı noktalarını karakter doğduğu anda önceden oluşturun.
- Humanoid Durum Kontrolü: Enum.HumanoidStateType.Physics durumuna geçin ve düşüş sırasında GettingUp durumunu kapatın.
2. Çarpışma Grupları ve NoCollisionConstraints
Uzuvların birbirine girmesiyle oluşan fiziksel patlamaları engelleme:
- İç Çarpışma Patlaması: Üst üste binen uzuvlar devasa bir itme kuvveti üreterek karakteri haritadan fırlatabilir.
- NoCollisionConstraints: Bitişik uzuvları bu kısıtlamayla bağlayarak birbirleriyle olan temas hesaplamalarını kapatın.
- CollisionFilteringService: Ragdoll parçalarını sadece statik zeminle temas eden özel bir çarpışma grubuna atayın.
- CanCollide Ayarı: Yerde pürüzsüzce yuvarlanması için HumanoidRootPart üzerinde CanCollide kapatılmalı, Torso üzerinde açık kalmalıdır.
--!strict
-- Ayağa kalkma özellikli Luau Ragdoll Yöneticisi
local PhysicsService = game:GetService("PhysicsService")
3. Ağ Sahipliği (Network Ownership) ve Replikasyon
Fizik simülasyonunun nerede hesaplandığı akıcılığı doğrudan belirler:
- Yerel Oyuncu: Gecikmesiz tepki için `SetNetworkOwner(player)` ile fiziği oyuncunun kendi cihazında hesaplatın.
- NPC ve Cesetler: Hileleri ve senkron kopmalarını önlemek için `SetNetworkOwner(nil)` ile sunucuya verin.
- Bant Genişliği Tasarrufu: Hareketi duran uzuvların uyku moduna (sleep) geçmesine izin verin.
- Işınlanma Koruması: Motor6D kapandığı karede ağ sahipliğini hemen değiştirmeyin, 1 kare bekleyin.
4. Doğrulma Animasyonu ve Durum Toparlama
Karakterin yerden sıçramadan pürüzsüzce ayağa kalkma adımları:
- Zemin Uyumu: Gövdeden aşağıya raycast atarak HumanoidRootPart yönünü zemin eğimine göre hizalayın.
- Geri Işınlanmayı Önleme: Motor6D eklemlerini açmadan önce HumanoidRootPart pozisyonunu gövde pozisyonuna çekin.
- Animasyon Geçişi: Eklemleri 0.3 saniyede kademeli açarken kalkış animasyonunu oynatın.
- Kısa Süreli Bağışıklık: Sonsuz düşüş döngülerine girmemesi için ayağa kalkarken kısa bir hasarsızlık verin.
5. Mobil Cihazlar İçin Optimizasyon ve İlkeler
Mobil işlemcileri yormadan fizik çalıştırmanın kuralları:
- Kısıtlı Eklem Sayısı: Yalnızca ana uzuvlara BallSocket koyun; şapka ve pelerinler sabit kalsın.
- Fizik Uykusu: Yerde duran gövdeleri fizik motorunun otomatik uyutmasına izin verin.
- Hafıza Temizliği: Karakter öldükten 10 saniye sonra ragdoll nesnelerini bellekten temizleyin.
- MicroProfiler Takibi: Ctrl+F6 ile `physics::step` süresinin kare başına 3 ms altında kaldığını doğrulayın.
Frequently Asked Questions
Ragdoll olduğunda karakter neden gökyüzüne fırlıyor?
Uzuvların birbirine çarpmasından (Self-Collision) kaynaklanır. NoCollisionConstraints bağlayın ve HumanoidRootPart için CanCollide kapatın.
Ragdoll fiziği nerede hesaplanmalıdır?
Aktif oyuncu için cihazında (`SetNetworkOwner(player)`), ceset ve NPC'ler için sunucuda (`SetNetworkOwner(nil)`).
Ayağa kalkarken ilk düşülen yere geri ışınlanma nasıl çözülür?
Motor6D eklemlerini açmadan hemen önce HumanoidRootPart konumunu mevcut Torso konumuna getirin.
BallSocketConstraints içindeki TwistLimits ne işe yarar?
Kol ve bacakların kendi eksenleri etrafında 360 derece burgu gibi dönmesini engeller.