Ç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ü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.
  • Üst düzey Terrain sınıfı BasePart sınıfından türetildiği için, diğer BaseParts nesnelerinin Terrain voxel'leri ile çarpışıp çarpışmayacağını belirlemek için Terrain'e bir çarpışma grubu atayabilirsiniz.

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.

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

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.

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

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:

  1. 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.

    Çarpışma Grupları Düzenleyicisinde Liste Görünümü'nde yeni grup eklenmiş
  2. 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.

    Çarpışma Grupları Düzenleyicisinde bir grubu yeniden adlandırmak için buton ve alan gösteriliyor.

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.

Çarpışma Grupları Düzenleyicisinde Liste Görünümü'nde yapılandırılmış grup

Nesneleri gruplara ata

Daha önce kaydedilmiş çarpışma gruplarına nesneleri atamak için Stüdyo düzenleyicisi aracılığıyla:

  1. Çarpışma grubunun parçası olabilecek bir veya daha fazla BaseParts seçin.

  2. 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.

    Seçilen parçaları gruba eklemek için Çarpışma Grupları Düzenleyicisinde gösterilen artı butonu

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

Seçilen çarpışma grubunun parça’nın CollisionGroup özelliği olarak gösterildiği

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.

Kontrol Noktaları grubunun StudioSelectable grubu ile çarpışamaz olacak şekilde  yapılandırıldığı

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 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 -- Böylece CanQuery değeri "false" olan parçalar seçilebilir
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, ö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.
Kale kulesinin orijinal ağı

Ç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.

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