Çarpışmalar

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Bir çarpışma, iki 3D nesnenin 3D dünyada temas etmesiyle meydana gelir. Özelleştirilmiş çarpışma yönetimi için, BasePart bir dizi çarpışma olayı ve çarpışma filtreleme tekniğine sahiptir, böylece hangi fiziksel bileşenlerin diğerleriyle çarpışacağını kontrol edebilirsiniz.

Çarpışma olayları

Çarpışma olayları, iki BaseParts nesnesinin 3D dünyada birbirine dokunduğunda veya dokunmayı bıraktığında meydana gelir. Bu çarpışmaları, Touched ve TouchEnded olayları aracılığıyla tespit edebilirsiniz; bu olaylar, her iki parçanın CanCollide özellik değerine bakılmaksızın meydana gelir. Parçalar üzerindeki çarpışma yönetimini düşünürken, 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 olarak çarpışıp çarpışmayacağını etkiler ve onlara kuvvetlerin etki etmesine neden olur. CanCollide bir parça için devre dışı bırakılmış olsa bile, Touched ve TouchEnded olayları aracılığıyla dokunma ve dokunmama durumlarını tespit edebilirsiniz.
  • Touched ve TouchEnded olayları yalnızca fiziksel hareket sonucunda tetiklenir; bir parçanın başka bir parça ile kesişmesini veya kesişmeyi durdurmasını sağlayan Position veya CFrame değişikliklerinden kaynaklanmaz.
  • Üst düzey Terrain sınıfı BasePart'tan türetilmiştir, bu nedenle diğer BaseParts'ın Terrain voxel'leri ile çarpışıp çarpışmayacağını belirlemek için Terrain'a bir çarpışma grubu atayabilirsiniz.

Touched

Touched olayı, bir BasePart başka bir nesneye veya bir Terrain voxel'ine temas ettiğinde tetiklenir. Bu olay yalnızca fiziksel simülasyon sonucunda tetiklenir ve parçanın Position veya CFrame'si açıkça ayarlandığında başka bir parça veya voxel ile kesiştiğinde tetiklenmez.

Aşağıdaki kod örneği, Touched olayının özel bir onTouched() fonksiyonuna nasıl bağlanabileceğini gösterir. Olay, çarpışmaya dahil olan diğer parçayı belirten otherPart argümanını fonksiyona gönderir.

Parça Çarpışması
local part = workspace.Part
local function onTouched(otherPart)
print(part.Name .. " ile çarpıştı " .. otherPart.Name)
end
part.Touched:Connect(onTouched)

Touched olayının, hareket eden bir nesnenin "yerleştiği" bir pozisyona geçmesi veya bir çarpışmanın çok parçalı model içermesi gibi ince fiziksel çarpışmalara bağlı olarak hızlı bir şekilde birden fazla kez tetiklenebileceğini unutmayın. Gereksiz yere daha fazla Touched olayı tetiklememek için, bir örnek özellik aracılığıyla bir "soğuma" süresi uygulayan basit bir debounce sistemi uygulayabilirsiniz.

Soğuma Süresi Olan Parça Çarpışması
local part = workspace.Part
local COOLDOWN_TIME = 1
local function onTouched(otherPart)
if not part:GetAttribute("Touched") then
print(part.Name .. " ile çarpıştı " .. otherPart.Name)
part:SetAttribute("Touched", true) -- Özelliği true olarak ayarla
task.wait(COOLDOWN_TIME) -- Soğuma süresi için bekle
part:SetAttribute("Touched", false) -- Özelliği sıfırla
end
end
part.Touched:Connect(onTouched)

TouchEnded

TouchEnded olayı, bir BasePart'ın tüm çarpışma sınırlarının başka bir BasePart veya dolu bir Terrain voxel'inin sınırlarını terk ettiğinde tetiklenir. Bu olay yalnızca fiziksel simülasyon sonucunda tetiklenir ve parçanın Position veya CFrame'si açıkça ayarlandığında başka bir parça veya voxel ile kesişmeyi durdurduğunda tetiklenmez.

Aşağıdaki kod örneği, TouchEnded olayının özel bir onTouchEnded() fonksiyonuna nasıl bağlanabileceğini gösterir. Touched gibi, olay otherPart argümanını fonksiyona gönderir ve çarpışmaya dahil olan diğer parçayı belirtir.

Çarpışma Olmayan Tespit
local part = workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " artık " .. otherPart.Name ile temas etmiyor)
end
part.TouchEnded:Connect(onTouchEnded)

Çarpışma filtreleme

Çarpışma filtreleme, hangi fiziksel parçaların diğerleriyle çarpışacağını tanımlar. Birçok nesne için filtrelemeyi çarpışma grupları aracılığıyla yapılandırabilir veya NoCollisionConstraint örnekleri ile parça-parça bazında çarpışmaları kontrol edebilirsiniz.

Çarpışma grupları

Çarpışma grupları, BaseParts'ı özel gruplara atamanıza ve bunların diğer gruplardaki nesnelerle çarpışıp çarpışmayacağını belirtmenize olanak tanır. Çarpışma grubu olmayan parçalar, her iki parçanın da CanCollide özelliği true olarak ayarlanmış olsa bile birbirlerinin içinden tamamen geçer. Çarpışma grupları, Workspace veya WorldModel bazında oluşturulur ve yapılandırılır.

Yukarıdaki videoda, dönen nesneler farklı çarpışma gruplarındadır, böylece başka bir renkteki nesnelerle çarpışırken kendi renklerindeki nesnelerle çarpışmazlar.

Çarpışma gruplarını kolayca Studio'nun Çarpışma Grupları editörü aracılığıyla ayarlayabilirsiniz; bu editöre Studio'nun Pencere ⟩ 3D menüsünden erişebilirsiniz.

Grupları kaydet

Workspace, kendi yapılandırılabilir çarpışma gruplarının durumunu saklar. Ayrıca, herhangi bir WorldModel, sorgular için kendi çarpışma gruplarını kullanmayı seçebilir.

Editör, yeniden adlandırılamayan veya silinemeyen bir Varsayılan çarpışma grubu içerir. Tüm BaseParts, başka bir gruba atanmadıkça otomatik olarak bu varsayılan gruba aittir; 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:

  1. Varsayılan olarak, gruplar Workspace üzerinde kaydedilir, ancak yerinizde en az bir WorldModel varsa, çarpışma grupları editörünün üst kısmında bir seçim açılır menüsü görünecektir. Bu açılır menüyü kullanarak farklı WorldModel örnekleri arasında çarpışma gruplarını yapılandırabilirsiniz.

    Çarpışma grubu editörünün mevcut aktif dünyası olarak gösterilen Workspace

    Herhangi bir WorldModel için, sorguları için Workspace çarpışma gruplarını kullanmasını sağlamak üzere Workspace çarpışma gruplarını kullan seçeneğini açabilirsiniz.

    Bir WorldModel'in UseWorkspaceCollisionGroups özelliğini açmak için gösterilen onay kutusu
  2. Editör panelinin üst kısmındaki Grup Ekle butonuna tıklayın, yeni bir grup adı 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ütun ve üst satırda görünür.

    Liste Görünümünde Çarpışma Grupları Editörüne eklenen yeni grup
  3. Gerekirse süreci tekrarlayın, her grup için benzersiz ve açıklayıcı bir ad seçin. Geliştirme sırasında bir grubun adını değiştirebileceğinizi unutmayın; bunun için alanına tıklayabilir veya seçip yeniden adlandır butonuna tıklayabilirsiniz.

    Çarpışma Grupları Editöründe bir grubu yeniden adlandırmak için gösterilen buton ve alan

Grup çarpışmalarını yapılandır

Varsayılan yapılandırma altında, tüm gruplardaki nesneler birbirleriyle çarpışır. Bir gruptaki nesnelerin diğer bir gruptaki nesnelerle çarpışmasını önlemek için, ilgili satır/sütundaki kutuyu işaretlemeyin.

Aşağıdaki örnekte, Küpler grubundaki nesneler Kapılar grubundaki nesnelerle çarpışmayacaktır.

Çarpışma Grupları Editöründe Liste Görünümünde yapılandırılan grup

Nesneleri gruplara atama

Studio editörü aracılığıyla kaydettiğiniz gruplara nesneleri atamak için:

  1. Bir çarpışma grubunun parçası olarak nitelendirilen bir veya daha fazla BaseParts seçin.

  2. Seçilen nesneleri, ilgili satır için ⊕ butonuna tıklayarak gruba atayın. Nesneler yalnızca bir çarpışma grubuna ait olabilir, bu nedenle yeni bir gruba yerleştirildiğinde mevcut gruptan çıkarılır.

    Seçilen parçaları bir gruba eklemek için Çarpışma Grupları Editöründe gösterilen artı butonu

    Atandıktan sonra, yeni grup nesnenin CollisionGroup özelliği altında yansıtılır.

    Seçilen çarpışma grubunun parçanın CollisionGroup özelliği olarak gösterilmesi

StudioSelectable grubu

Studio'daki araçlar, 3D görünümde tıklanırken hangi nesnelerin seçim için aday olduğunu belirlemek için çarpışma filtreleme sistemini kullanır. Atanan çarpışma grubu StudioSelectable ile çarpışmayan nesneler göz ardı edilir.

Örneğin, bir yarış oyununda etkili alanları büyük şeffaf parçalarla tanımlanan kontrol noktalarınız varsa, bunları Kontrol Noktaları çarpışma grubuna atayabilir ve ardından bu grubu StudioSelectable ile çarpışamaz hale getirerek, temel harita geometrisini düzenlerken engel olmalarını önleyebilirsiniz.

Kontrol Noktaları grubunun StudioSelectable grubu ile çarpışamaz hale getirildiği gösterilmektedir

Eklenti kodu için, parçaları imlecin altında bulurken RaycastParams'ınızın çarpışma grubu filtresi olarak "StudioSelectable" atamanız önerilir. Bu, eklentilerinizin, yaratıcıların yerleşik Studio araçlarından beklemeyi öğrendiği seçim mekanikleriyle eşleşmesini sağlar.

Önerilen Eklenti Seçim Raycast
local UserInputService = game:GetService("UserInputService")
local raycastParams = RaycastParams.new()
raycastParams.CollisionGroup = "StudioSelectable" -- Konvansiyonu takip etmek için
raycastParams.BruteForceAllSlow = true -- "false" olan CanQuery'ye sahip parçaların seçilebilmesi için
local 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, çarpışma grupları kurmadan, örneğin bir aracın tekerleği ile şasisinin çarpışmasını önlemek için No Collision kısıtlamasını düşünebilirsiniz. Avantajları şunlardır:

  • Çarpışma grupları ve/veya yapılandırma scriptleri gerektirmediğinden, özelleştirilmiş çarpışma filtrelemesi ile kolayca model oluşturabilir ve paylaşabilirsiniz.
  • Bağlı parçalar birbirleriyle çarpışmaz, ancak diğer nesnelerle çarpışabilirler.

Karakter çarpışmalarını devre dışı bırakma

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, aşağıdaki Script aracılığıyla bunu önleyebilirsiniz.

Script - Karakter Çarpışmalarını Devre Dışı Bırak
local Players = game:GetService("Players")
workspace:RegisterCollisionGroup("Karakterler")
workspace:CollisionGroupSetCollidable("Karakterler", "Karakterler", false)
local function onDescendantAdded(descendant)
-- Herhangi bir parça alt nesnesi için çarpışma grubunu ayarla
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Karakterler"
end
end
local function onCharacterAdded(character)
-- Fiziksel ayar 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ğini tespit et
player.CharacterAdded:Connect(onCharacterAdded)
end)

Model çarpışmaları

Model nesneleri parçaların konteynerleridir ve BasePart'tan türetilmezler, bu nedenle BasePart.Touched veya BasePart.TouchEnded olaylarına doğrudan bağlanamazlar. Bir modelin çarpışma olaylarını tetikleyip tetiklemeyeceğini belirlemek için, çocuklarını döngüye almanız ve her bir çocuk BasePart'a özel onTouched() ve onTouchEnded() fonksiyonlarını bağlamanız gerekir.

Aşağıdaki kod örneği, çok parçalı bir modelin tüm BaseParts'ını çarpışma olaylarına bağlar ve 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 göz ardı et
if otherPart:IsDescendantOf(model) then return end
-- Model parçalarının dokunma sayısını artır
numTouchingParts += 1
print(model.Name, "ile kesişti", otherPart.Name, "| Model parçaları dokunuyor:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Modelin kendisiyle kesişmeyen örnekleri göz ardı et
if otherPart:IsDescendantOf(model) then return end
-- Model parçalarının dokunma sayısını azalt
numTouchingParts -= 1
print(model.Name, "ile kesişmeyi bıraktı", otherPart.Name, "| Model parçaları dokunuyor:", numTouchingParts)
end
for _, child in model:GetChildren() do
if child:IsA("BasePart") then
child.Touched:Connect(onTouched)
child.TouchEnded:Connect(onTouchEnded)
end
end

Mesh ve katı model çarpışmaları

MeshPart ve PartOperation (parçalar katı modelleme ile birleştirilmiş) BasePart'ın alt sınıflarıdır, bu nedenle mesh ve katı model parçaları, normal parçalarla aynı çarpışma olaylarını ve çarpışma filtreleme seçeneklerini miras alır. Ancak, mesh ve katı model parçaları genellikle daha karmaşık geometrilere sahip olduğundan, çarpışma yönetimi için fiziksel sınırların görsel temsille ne kadar hassas bir şekilde hizalandığını belirleyen belirgin bir CollisionFidelity özelliğine sahiptir.

CollisionFidelity özelliği, en düşükten en yükseğe doğru, hassasiyet ve performans etkisi sırasına göre aşağıdaki seçeneklere sahiptir:

  • Kutu — Küçük veya etkileşimli olmayan nesneler için ideal olan bir sınırlayıcı çarpışma kutusu oluşturur.
  • Kapsül — Daha az belirgin girintilere veya boşluklara sahip nesneler için uygun olan bir konveks kapsül oluşturur.
  • Varsayılan — Karmaşık nesneler için yarı detaylı etkileşim ihtiyaçlarını destekleyen yaklaşık bir çarpışma şekli üretir.
  • Hassas Konveks Ayrıştırma — En hassas fideliteyi sunar, ancak yine de görselin 1:1 temsili değildir. Bu seçenek, en pahalı performans maliyetine sahiptir ve motorun hesaplaması daha uzun sürer.
Kale kulesinin orijinal mesh'i

Çarpışma fidelitesi seçeneklerinin performans etkisi ve bunları nasıl azaltacağınız hakkında daha fazla bilgi için performans optimizasyonu bölümüne bakın.

©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.