Ç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 sonucu tetiklenir; bir parçanın diğer bir parça veya voxel 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 sınıfından miras alır, bu nedenle diğer BaseParts nesnelerinin 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 sonucu tetiklenir ve parçanın Position veya CFrame değeri 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 Workspace = game:GetService("Workspace")
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 girmesi 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 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 .. " 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 sonucu tetiklenir ve parçanın Position veya CFrame değeri 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 Workspace = game:GetService("Workspace")
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 nesnelerini ö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.

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.

Editör, Studio'nun sol veya sağ tarafına sabitlenmeyi tercih eden Liste Görünümü veya üst veya alt kısma sabitlenmeyi tercih eden daha geniş bir Tablo Görünümü olarak çalışır.

Çarpışma Grupları Editöründe Liste Görünümü örneği

Grupları kaydet

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 bu varsayılan gruba otomatik olarak 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. 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 yeni grup eklendi
  2. Gerekirse süreci tekrarlayın, her grup için benzersiz ve açıklayıcı bir ad seçin. Bir grubun adını geliştirme sırasında 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 buton ve alan gösterilmektedir

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 kutucuğu 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ılmış grup

Nesneleri gruplara atama

Kaydettiğiniz gruplara atama yapmak için Studio editörü aracılığıyla:

  1. Bir çarpışma grubuna dahil olan bir veya daha fazla BaseParts nesnesini seçin.

  2. Gruplarına atamak için ilgili satırdaki butonuna tıklayı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 artı butonu gösterilmektedir

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

Seçilen çarpışma grubu, parçanın CollisionGroup özelliği olarak gösterilmektedir

StudioSelectable çarpışma 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ı grubu, StudioSelectable grubu ile çarpışamaz olacak şekilde yapılandırılmıştır

Eklenti kodu için, parçaların imleç altında bulunmasını sağlamak amacıyla 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 Workspace = game:GetService("Workspace")
local raycastParams = RaycastParams.new()
raycastParams.CollisionGroup = "StudioSelectable" -- Konvansiyona uymak 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ça arasında çarpışmaları önlemek için, örneğin bir aracın tekerleği ile şasisinin çarpışmasını önlemek amacıyla çarpışma grupları kurmadan, 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ı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, aşağıdaki Script aracılığıyla bunu önleyebilirsiniz.

Script - 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ça alt nesnesi için çarpışma grubunu ayarla
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ğini tespit et
player.CharacterAdded:Connect(onCharacterAdded)
end)

Model çarpışmaları

Model nesneleri, parçaların konteynerleri olduğundan BasePart'dan miras almazlar, bu nedenle BasePart.Touched veya BasePart.TouchEnded olaylarına doğrudan bağlanamazlar. Bir modelin çarpışma olaylarını tetkip etmesini belirlemek için, çocuklarını döngüye almanız ve özel onTouched() ve onTouchEnded() fonksiyonlarını her bir BasePart'a bağlamanız gerekir.

Aşağıdaki kod örneği, çok parçalı bir modelin tüm BaseParts nesnelerini ç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ştirildiğinde) 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ı azaltma yolları 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.