Modern Roblox deneyimlerinde karakterlerin zemine fiziksel olarak tepki vermesi, profesyonel projeleri öne çıkaran en kritik unsurdur. Statik animasyonlar merdiven çıkarken veya taşlık arazide yürürken ayakların havada asılı kalmasına yol açar.
Roblox Studio'nun güncel animasyon altyapısı IKControl ile yerel Ters Kinematik (IK) sunar. Raycast zemin tespiti, ağırlık harmanlama ve bakış açısı kısıtlamalarını harmanlayarak AAA kalitesinde prosedürel animasyonlar oluşturabilirsiniz.
1. Modern Animasyon Hattı: Animator ve Öncelikler
Luau ile iskelet animasyon parçalarını yönetmenin kuralları:
- Animator Kullanımı: Eskimiş
Humanoid:LoadAnimation()yerine her zamanAnimatornesnesini kullanarak çok oyunculu senkronizasyonu güvenceye alın. - Animasyon Öncelikleri: Hareketleri katmanlara ayırın (
Core,Idle,Movement,Action). Action önceliğindeki şarjör değiştirme bacak hareketini bozmadan kolları yönetir. - Ağırlık Harmanlama:
track:Play(fadeTime, weight)ile yürüme, koşma ve depar geçişlerini yumuşakça harmanlayın.
2. IKControl ile Ters Kinematik Mimarisi
Hedef noktaya doğru eklem açılarının hesaplanması:
- IKControl Bileşenleri:
Type(LookAt, Position, Transform),EndEffector(örn. LeftFoot),TargetveChainRoot(LeftUpperLeg) özelliklerini bağlayın. - Pole Kısıtlaması: Dizlerin veya dirseklerin geriye doğru ters bükülmesini engellemek için eklemin önüne bir
Polenesnesi yerleştirin. - Dinamik Weight Ayarı: Karakter engebeli zemine girdiğinde
Weightdeğerini 0'dan 1'e yumuşakça yükseltin.
3. Prosedürel Ayak Basma ve Zemin Uyumu
Ayakların merdiven ve yamaçlarda yere tam basması:
- Aşağı Doğru Raycast: Kalçadan aşağıya ışın göndererek mesafe ve zemin normal vektörünü elde edin.
- Dinamik Hedef Konumu: IK hedefini temas noktasına taban kalınlığını ekleyerek yerleştirin.
- Bilek Açısını Eşleme: Ayak açısını yüzey eğimine göre çevirerek tabanın zemine tam oturmasını sağlayın.
-- IKControl ile Prosedürel Ayak Basma Modülü
local RunService = game:GetService("RunService")
local FootIK = {}
FootIK.__index = FootIK
function FootIK.new(character)
local self = setmetatable({}, FootIK)
self.Char = character
self.Humanoid = character:WaitForChild("Humanoid")
self.RootPart = character:WaitForChild("HumanoidRootPart")
local leftIK = Instance.new("IKControl")
leftIK.Name = "LeftFootIK"
leftIK.Type = Enum.IKControlType.Transform
leftIK.EndEffector = character:WaitForChild("LeftFoot")
leftIK.ChainRoot = character:WaitForChild("LeftUpperLeg")
local leftTarget = Instance.new("Attachment")
leftTarget.Name = "LeftIKTarget"
leftTarget.Parent = workspace.Terrain
leftIK.Target = leftTarget
leftIK.Parent = self.Humanoid
self.LeftIK = leftIK
self.LeftTarget = leftTarget
return self
end
function FootIK:Update(dt)
if self.Humanoid.FloorMaterial == Enum.Material.Air then
self.LeftIK.Weight = 0
return
end
local rayOrigin = self.Char.LeftUpperLeg.Position
local rayDirection = Vector3.new(0, -3.5, 0)
local rayParams = RaycastParams.new()
rayParams.FilterDescendantsInstances = {self.Char}
rayParams.FilterType = Enum.RaycastFilterType.Exclude
local result = workspace:Raycast(rayOrigin, rayDirection, rayParams)
if result then
self.LeftTarget.WorldPosition = result.Position + Vector3.new(0, 0.4, 0)
self.LeftIK.Weight = 0.8
else
self.LeftIK.Weight = 0
end
end
return FootIK
4. Dinamik Kafa ve Bakış Takibi (Look-At)
Kameraya veya yakındaki oyunculara doğal bakış yöneltme:
- Kamera Bakışı: Kafaya LookAt türünde IKControl ekleyip hedefi kameranın odak noktasına yönlendirin.
- Açı Kısıtlama: Boynun geriye bükülmemesi için yatayda 70, dikeyde 45 derece sınırı koyun.
- Yumuşak Sönümleme: Lerp veya yay mekaniği ile bakış geçişlerini pürüzsüzleştirin.
5. Mobil ve Performans Optimizasyonu
Kalabalık sunucularda 60 FPS performansını koruma:
- İstemci Tabanlı Hesaplama: Ayak basma hesaplarını istemcinin
RenderSteppeddöngüsünde çalıştırın. - LOD Ayırma: Kameradan 60 stud uzaktaki karakterlerde IKControl'ü kapatarak işlemciyi rahatlatın.
- Bellek Temizliği: Karakter yere yığıldığında veya öldüğünde IK bağlantılarını sonlandırın.
Frequently Asked Questions
Humanoid:LoadAnimation yerine neden Animator tercih edilmelidir?
Humanoid üzerindeki metot eskimiştir ve senkronizasyon hatalarına yol açar. Animator ağ çoğaltmasını doğrudan destekler.
IKControl'ün manuel CFrame hesaplarına göre farkı nedir?
Roblox'un C++ çekirdeğinde hesaplandığı için çok daha hızlıdır ve animasyonlarla pürüzsüzce harmanlanır.
Dizlerin ters dönmesi nasıl engellenir?
Dizin önüne bir Pole nesnesi koyup IKControl'ün Pole özelliğine bağlayarak yön tayini yapabilirsiniz.
Ayak basma kodu sunucuda mı istemcide mi çalışmalıdır?
Kesinlikle istemcide RenderStepped içinde çalışmalıdır; sunucuda çalıştırmak ağ gecikmesi ve kasılma yaratır.
Zıplarken IK nasıl devre dışı bırakılır?
Humanoid.FloorMaterial durumunu kontrol edin; havadayken Weight değerini 0'a çekin.