Duvarda koşma, kayma ve engelleri aşma mekanikleri modern aksiyon oyunlarının temelidir. Bunu yalnızca varsayılan Humanoid ile yapmaya çalışmak takılmalara ve düşmelere yol açar.
Modern Luau kısıtlamaları (`LinearVelocity` ve `VectorForce`) ile yönsel Raycast ışınlarını birleştirerek tüm platformlarda kusursuz çalışan bir hareket sistemi kurabilirsiniz.
1. Akıcı Parkur İçin Humanoid Durumlarını Yönetme
Özel hareket durum makinesi tasarımı:
- Çakışan Durumları Kapatma: Duvarda koşma başladığında tırmanma ve serbest düşme durumlarını kapatarak animasyon çakışmalarını önleyin.
- Ağ Sahipliği (Network Ownership): Gecikmeyi sıfırlamak için sunucuda karakterin ağ sahipliğini oyuncuya verin.
- Durum Makinesi: Yürüme, depar, duvarda koşma, tutunma ve tırmanma durumlarını bağımsız modüller halinde yapılandırın.
2. Yönsel Raycast ve Duvar Normali Hizalaması
Koşulabilir yüzeyleri algılama ve yön hesabı:
- Yan Raycast Sondaları: Bel ve omuz hizasından sağa ve sola 3.5 stud uzunluğunda ışınlar göndererek duvarları algılayın.
- Yüzey Açısı Kontrolü: Yüzeyin dik olduğundan emin olun (75° - 105° arası) ve eğimli zeminleri eleyin.
- Vektörel Çarpım ile Yön: Duvar yüzeyine paralel ilerleme yönünü bulmak için
wallNormal:Cross(Vector3.yAxis)formülünü kullanın.
3. Modern Fizik Kısıtlamaları: LinearVelocity ve VectorForce
Eski BodyMovers yerine modern kısıtlamaları kullanma:
- Sabit Hız İçin LinearVelocity: Duvar sürtünmesini yenerek oyuncunun sabit bir hızla ilerlemesini sağlar.
- Yerçekimi Önleyici VectorForce: Oyun alanındaki yerçekimini (196.2 studs/s²) karakter kütlesine uygun dikey bir kuvvetle sıfırlayın.
- Kademeli Düşüş: 1.5–2 saniye sonra yukarı yönlü kuvveti kademeli olarak azaltarak gerçekçi bir yay çizip düşmesini sağlayın.
-- İstemci tarafı Duvarda Koşma Denetleyicisi
local RunService = game:GetService("RunService")
local WallRun = {}
WallRun.__index = WallRun
function WallRun.new(character)
local self = setmetatable({}, WallRun)
self.Char = character
self.RootPart = character:WaitForChild("HumanoidRootPart")
self.Humanoid = character:WaitForChild("Humanoid")
local att = Instance.new("Attachment", self.RootPart)
local lv = Instance.new("LinearVelocity")
lv.Attachment0 = att
lv.MaxForce = 15000
lv.RelativeTo = Enum.ActuatorRelativeTo.World
lv.Enabled = false
lv.Parent = self.RootPart
self.Attachment = att
self.LinearVelocity = lv
self.IsRunning = false
return self
end
function WallRun:CheckWall(side)
local rightVec = self.RootPart.CFrame.RightVector
local rayDir = (side == "Left" and -rightVec or rightVec) * 3.5
local params = RaycastParams.new()
params.FilterDescendantsInstances = {self.Char}
params.FilterType = Enum.RaycastFilterType.Exclude
return workspace:Raycast(self.RootPart.Position, rayDir, params)
end
function WallRun:Start(hitNormal, forwardDir)
self.IsRunning = true
self.LinearVelocity.VectorVelocity = forwardDir * 32 + Vector3.new(0, 4, 0)
self.LinearVelocity.Enabled = true
self.Humanoid:ChangeState(Enum.HumanoidStateType.Physics)
end
function WallRun:Stop()
self.IsRunning = false
self.LinearVelocity.Enabled = false
self.Humanoid:ChangeState(Enum.HumanoidStateType.Freefall)
end
return WallRun
4. Çıkıntı Algılama ve Yukarı Tırmanma (Mantle)
Kenarlara tutunma ve engeli aşma mekaniği:
- İki Aşamalı Raycast: Göğüs hizasındaki ışın duvarı, yukarıdan aşağı inen ışın ise çıkıntının tam üst kenarını belirler.
- AlignPosition ile Sabitleme: Çıkıntı yakalandığında karakteri kenara sabitleyip asılı kalmasını sağlayın.
- Bézier Eğrisi ile Tırmanma: Zıplama tuşuna basıldığında karakteri engele takılmadan pürüzsüz bir yay ile yukarı çıkarın.
5. Mobil Dokunmatik Kontroller ve Sunucu Doğrulaması
Mobil uyumluluk ve hile koruması:
- Geniş Dokunmatik Düğmeler: Duvardan zıplama ve tırmanma eylemlerini ekranda en az 48x48 piksel boyutundaki butonlara bağlayın.
- Sunucu Hız Kontrolü: Sunucu kareler arası yer değiştirmeyi denetleyerek hız veya uçma hilelerini engeller.
- Duvar Varlık Denetimi: Sunucu kendi raycast sorgusunu yaparak oyuncunun yanında gerçekten duvar olup olmadığını onaylar.
Frequently Asked Questions
Neden BodyVelocity yerine LinearVelocity kullanılmalıdır?
BodyVelocity desteği sonlandırılmış eski bir sistemdir. LinearVelocity modern kısıtlama çözücüsüyle çok daha kararlı ve hatasız çalışır.
Duvarda koşarken aşağı kaymayı nasıl engellersiniz?
VectorForce ile yerçekimini nötrleyecek kadar yukarı yönlü dikey kuvvet uygulayarak.
Duvar boyunca ilerleme vektörü nasıl hesaplanır?
Raycast ile elde edilen yüzey normali ile dünyanın dikey yukarı vektörü (0, 1, 0) arasında çapraz çarpım (Cross Product) yapılarak.
Sunucu duvarda koşma hilelerini nasıl önler?
Oyuncunun yakınında fiziksel bir duvar olduğunu kendi raycast ışınıyla kontrol ederek ve maksimum hızı sınırlandırarak.