Bir çarpışma, iki 3D nesnenin 3D dünyasında temas ettiğinde meydana gelir. Özelleştirilmiş çarpışma yönetimi için BasePart, hangi fiziksel montajların diğerleriyle çarpıştığını kontrol etmenizi sağlayan bir dizi çarpışma olayı ve çarpışma filtreleme tekniğine sahiptir.
Çarpışma olayları
Çarpışma olayları, iki BaseParts nesnesinin 3D dünyasında dokunduğunda veya teması sona erdiğinde meydana gelir. Bu çarpışmaları, Touched ve TouchEnded olayları aracılığıyla tespit edebilirsiniz; bu olaylar, her iki parçanın CanCollide özellik değeri ne olursa olsun meydana gelir. Parçalarda çarpışma yönetimini düşünüyorum, aşağıdakilere dikkat edin:
- Bir parçanın CanTouch özelliği, çarpışma olaylarını tetikleyip tetiklemeyeceğini belirler. false olarak ayarlandığında, ne Touched ne de TouchEnded tetiklenecektir.
- Bir parçanın CanCollide özelliği, diğer parçalarla fiziksel çarpışıp çarpışmayacağını etkiler ve üzerlerinde kuvvetlerin etki etmesine neden olur. CanCollide özelliği bir parçada devre dışı bırakılmış olsa bile, Touched ve TouchEnded olayları aracılığıyla dokunuş ve temas dosyaları tespit edilebilir.
- Touched ve TouchEnded olayları yalnızca fiziksel hareket sonucunda tetiklenir, başka bir parçanın içine girmesi veya bir parçanın diğer bir parçayla temasını sona erdirmesi nedeniyle bir Position veya CFrame değişikliklerinden değil.
Touched
Touched olayı, bir BasePart'ın başka bir nesne veya bir Terrain voxel'i ile temas ettiğinde tetiklenir. Sadece fizik simülasyonu sonucunda tetiklenir ve parça pozisyonu (Position) veya CFrame açıkça bir başka parça veya voxel ile kesişecek şekilde ayarlandığında tetiklenmeyecektir.
Aşağıdaki kod örneği, Touched olayının özel bir onTouched() işlevine bağlanma biçimini göstermektedir. Olay, çarpışmaya dahil olan diğer parçayı belirten otherPart argümanını işlevine iletir.
Parça Çarpışması
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local function onTouched(otherPart)
print(part.Name .. " " .. otherPart.Name .. " ile çarpıştı")
end
part.Touched:Connect(onTouched)
Touched olayının, hareket eden bir nesnenin "yerleştiği" bir pozisyona yerleşirken veya bir çarpışmanın çoklu parça model içerdiği durumlarda, hızlı bir şekilde birden fazla kez tetiklenebileceğine dikkat edin. Gereğinden fazla Touched olayı tetiklenmesini önlemek için, bir örnek özellik aracılığıyla "soğuma" süresi uygulamak için basit bir debounce sistemi uygulayabilirsiniz.
Soğuma ile Parça Çarpışması
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local COOLDOWN_TIME = 1
local function onTouched(otherPart)
if not part:GetAttribute("Touched") then
print(part.Name .. " " .. otherPart.Name .. " ile çarpıştı")
part:SetAttribute("Touched", true) -- Özelliği true olarak ayarla
task.wait(COOLDOWN_TIME) -- Soğuma süresi boyunca bekle
part:SetAttribute("Touched", false) -- Özelliği sıfırla
end
end
part.Touched:Connect(onTouched)
TouchEnded
TouchEnded olayı, bir BasePart'ın çarpışma alanlarının tamamen başka bir BasePart veya dolu bir Terrain voxel'inin sınırlarını terk ettiğinde tetiklenir. Bu olay, yalnızca fizik simülasyonu sonucunda tetiklenir ve parça pozisyonu (Position) veya CFrame açıkça başka bir parçayla veya voxel ile kesişmeyi durduracak şekilde ayarlandığında tetiklenmeyecektir.
Aşağıdaki kod örneği, TouchEnded olayının özel bir onTouchEnded() işlevine bağlanma biçimini göstermektedir. Touched gibi, bu olay da çarpışmaya dahil olan diğer parçayı belirten otherPart argümanını işlevine iletir.
Çarpışma Dışı Tespit
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " " .. otherPart.Name .. " ile artık temas etmiyor")
end
part.TouchEnded:Connect(onTouchEnded)
Çarpışma filtreleme
Çarpışma filtreleme, hangi fizik parçalarının diğerleriyle çarpışacağını tanımlar. Birçok nesne için filtrelemeyi yapılandırabilir veya NoCollisionConstraint nesneleriyle belirli bir parça‑parça temelli çarpışmaları kontrol edebilirsiniz.
Çarpışma grupları
Çarpışma grupları, BaseParts'ı belirli gruplara atamanıza ve bunların diğer gruplardaki parçalarla çarpışıp çarpışmadığını belirtmenize olanak tanır. Çarpışması olmayan gruplardaki parçalar, her iki parçanın da CanCollide özelliği true olarak ayarlanmış olsa bile birbirlerinin içinden geçer.
Stüdyo'nun Çarpışma Grupları düzenleyicisi aracılığıyla çarpışma gruplarını kolayca ayarlayabilirsiniz; bu düzenleyici, Stüdyo'nun Pencere ⟩ 3D menüsünden erişilebilir.
Düzenleyici, Stüdyo'nun sol veya sağ kenarına sabitlenmiş Liste Görünümü veya daha geniş bir Tablo Görünümü şeklinde çalışır; bu, üstte veya altta sabitlenmeyi tercih eder.

Grupları Kaydet
Düzenleyiciye kaydedilemeyen yalnızca bir Varsayılan çarpışma grubu dahildir. Tüm BaseParts bu varsayılan gruba otomatik olarak aittir, başka bir gruba atanmadıkça, bu da onların Varsayılan gruptaki diğer tüm nesnelerle çarpışacağı anlamına gelir.
Yeni bir çarpışma grubu oluşturmak için:
Düzenleyici panelinin üst kısmındaki Grup Ekle butonuna tıklayın, yeni grup adını girin ve Enter tuşuna basın. Yeni grup, liste görünümündeki her iki sütunda veya tablo görünümündeki sol sütunda ve üst satırda görünecektir.

Gerekirse işlemi tekrarlayın, her grup için benzersiz ve tanımlayıcı bir ad seçin. Bir grubun adını, alanına tıklayarak veya onu seçip yeniden adlandır butonuna tıklayarak dönüştürebilirsiniz.

Grup çarpışmalarını yapılandır
Varsayılan yapılandırma altında, tüm gruplardaki nesneler birbirleriyle çarpışır. Bir grubun nesnelerinin başka bir grubun nesneleriyle çarpışmasını engellemek için, ilgili satır/sütunundaki kutucuğu işareti kaldırarak çıkarın.
Aşağıdaki örnekte, Küpler grubundaki nesneler Kapılar grubundaki nesnelerle çarpışmayacaktır.

Nesneleri gruplara ata
Daha önce kaydedilmiş çarpışma gruplarına nesneleri atamak için Stüdyo düzenleyicisi aracılığıyla:
Çarpışma grubunun parçası olabilecek bir veya daha fazla BaseParts seçin.
Grup için sütunun üst kısmındaki ⊕ butonuna tıklayarak onlara atayın. Nesneler yalnızca bir çarpışma grubuna dahil olabilir, bu nedenle onları yeni bir gruba koymak, mevcut gruplarından çıkartır.

Atandıktan sonra, yeni grup nesnenin CollisionGroup özelliğinde yansıtılacaktır.

StudioSelectable çarpışma grubu
Stüdyo'daki araçlar, 3D görünümde tıklarken hangi nesnelerin seçim adayları olduğunu belirlemek için çarpışma filtreleme sistemini kullanır. Atanan çarpışma grubu StudioSelectable ile çarpışmayan nesneler göz ardı edilecektir.
Örneğin, yarış deneyiminizde alanları büyük şeffaf parçalarla tanımlanan kontrol noktalarınız varsa, bunları Kontrol Noktaları çarpışma grubuna atayabilir ve bu grubu StudioSelectable ile çarpışamaz hale getirerek harita geometrisini düzenlerken engel olmalarını önleyebilirsiniz.

Eklenti kodu için, işaretçinin altında parçaları bulmak için RaycastParams'in çarpışma grubu filtrelemesi olarak "StudioSelectable"'ı atamanız önerilir. Bu, eklentilerin yerleşik Stüdyo araçlarından beklenen seçim mekaniklerine uymasını sağlar.
Tavsiye Edilen Eklenti Seçim Raycastlocal UserInputService = game:GetService("UserInputService")local Workspace = game:GetService("Workspace")local raycastParams = RaycastParams.new()raycastParams.CollisionGroup = "StudioSelectable" -- Konvansiyona uymak içinraycastParams.BruteForceAllSlow = true -- Böylece CanQuery değeri "false" olan parçalar seçilebilirlocal mouseLocation = UserInputService:GetMouseLocation()local mouseRay = Workspace.CurrentCamera:ViewportPointToRay(mouseLocation.X, mouseLocation.Y)local filteredSelectionHit = Workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 10000, raycastParams)
Parça‑parça filtreleme
İki belirli parçanın çarpışmalarını önlemek için, örneğin bir aracın tekerleği ile şasisinin çarpışmalarını engellemek için çarpışma grupları ayarlamak yerine, No Collision kısıtlamasını düşünebilirsiniz. Avantajları şunlardır:
- Çarpışma grupları ve/veya yapılandırma betikleri gerekmez, dolayısıyla özelleştirilmiş çarpışma filtreleme ile oluşturulmuş ve paylaşılmış modelleri kolaylıkla oluşturabilirsiniz.
- Bağlantılı parçalar birbirleriyle çarpışmayacak, ancak başka nesnelerle çarpışabilirler.
Karakter çarpışmalarını devre dışı bırak
Roblox oyuncu karakterleri varsayılan olarak birbirleriyle çarpışır. Bu, karakterlerin belirli alanlara ulaşmak için birbirlerinin üstüne zıplaması gibi ilginç ama istenmeyen bir oyun deneyimi yaratabilir. Bu davranış istenmiyorsa, ServerScriptService içindeki aşağıdaki Script ile önleyebilirsiniz.
Betik - Karakter Çarpışmalarını Devre Dışı Bırak
local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
PhysicsService:RegisterCollisionGroup("Karakterler")
PhysicsService:CollisionGroupSetCollidable("Karakterler", "Karakterler", false)
local function onDescendantAdded(descendant)
-- Herhangi bir parçanın çarpışma grubunu ayarlayın
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Karakterler"
end
end
local function onCharacterAdded(character)
-- Fizik ayarları için mevcut ve yeni alt nesneleri işleyin
for _, descendant in character:GetDescendants() do
onDescendantAdded(descendant)
end
character.DescendantAdded:Connect(onDescendantAdded)
end
Players.PlayerAdded:Connect(function(player)
-- Oyuncunun karakterinin eklendiğinde tespit edin
player.CharacterAdded:Connect(onCharacterAdded)
end)
Model çarpışmaları
Model nesneleri, parçalar için konteynerlerdir ve BasePart sınıfından türetmezler, bu nedenle doğrudan BasePart.Touched veya BasePart.TouchEnded olaylarına bağlanamazlar. Bir modelin çarpışma olaylarını tetikleyip tetiklemeyeceğini belirlemek için, çocuklarının üzerinden döngüye girmeli ve her çocuk BasePart'a özel onTouched() ve onTouchEnded() işlevlerini bağlamanız gerekir.
Aşağıdaki kod örneği, bir çok parçalı modelin tüm BaseParts'ını çarpışma olaylarına bağlayarak diğer parçalarla toplam çarpışma sayısını takip eder.
Model Çarpışması
local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- Modelin kendisiyle kesişen örnekleri yok say
if otherPart:IsDescendantOf(model) then return end
-- Model parçalarının dokunuş sayısını artır
numTouchingParts += 1
print(model.Name, "ile kesişti", otherPart.Name, "| Model parçaları sayısı:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Modelin kendisiyle kesişmeyen örnekleri yok say
if otherPart:IsDescendantOf(model) then return end
-- Model parçalarının dokunuş sayısını azalt
numTouchingParts -= 1
print(model.Name, "ile kesişmedi", otherPart.Name, "| Model parçaları sayısı:", numTouchingParts)
end
for _, child in model:GetChildren() do
if child:IsA("BasePart") then
child.Touched:Connect(onTouched)
child.TouchEnded:Connect(onTouchEnded)
end
end
Ağ ve katı model çarpışmaları
MeshPart ve PartOperation (katı modelleme ile birleştirilen parçalar) BasePart'ın alt sınıflarıdır, bu nedenle ağlar ve katı model parçaları, normal parçalara benzer şekilde aynı çarpışma olaylarını ve çarpışma filtreleme seçeneklerini miras alırlar. Ancak, ağlar ve katı model parçalarının genellikle daha karmaşık geometriye sahip olmaları nedeniyle, fiziksel sınırların çarpışma yönetimi için görsel temsille ne kadar kesin bir şekilde örtüştüğünü belirten belirgin bir CollisionFidelity özelliği bulunur.
CollisionFidelity özelliği, aşağıdaki seçeneklere sahiptir; bunun sıralaması, en düşükten en yükseğe doğru detaylılık ve performans etkisini gösterir:
- Kutu — Küçük veya etkileşimde bulunmayan nesneler için ideal olan bir sınırlayıcı çarpışma kutusu oluşturur.
- Kapsül — Dikkat çekici oyuklara veya boşluklara sahip nesneler için uygun, gevşek bir kapsül oluşturur.
- Varsayılan — Karmaşık nesneler için yarı detaylı etkileşim gereksinimlerini destekleyen, yaklaşık bir çarpışma şekli üretir.
- KesinKapsülAyrıştırma — En yüksek doğruluğu sağlar ama yine de görsellerin 1:1 temsili değildir. Bu seçenek, en fazla maliyetli performansa sahip olup motorun hesaplaması daha uzun sürer.

Çarpışma doğruluğu seçeneklerinin performans üzerindeki etkisi ve bunun nasıl hafifletileceği hakkında daha fazla bilgi için Performans optimizasyonu bölümüne bakın.