Üç boyutlu iki nesne, 3D dünyasında temasa girerse bir çarpışma meydana gelir.Özelleştirilmiş çarpışma eleme için, BasePart bir dizi çarpışma olayı ve çarpışma filtreleme tekniğine sahiptir, böylece hangi fiziksel montajların diğerleriyle çarpışacağını kontrol edebilirsiniz.
Çarpışma olayları
Çarpışma etkinlikleri , iki BaseParts 3B dünyada dokunmaya veya dokunmayı durdurmaya başladığında meydana gelir.Bu çarpışmaları, herhangi bir parçanın Touched ve TouchEnded özellik değerinden bağımsız olarak meydana gelen CanCollide olayları aracılığıyla tespit edebilirsiniz.Parçalarda çarpışma ele alınmasını düşündüğünüzde, takip edilennoktalara dikkat edin:
- Bir parçanın CanTouch özelliği, çarpışma olaylarını tetikleyip etmediğini belirler. false olarak ayarlanırsa, ne Touched ne de TouchEnded ateşlenir.
- Bir parçanın özelliği, diğer parçalarla fiziksel olarak çarpışıp onlara güç uygulayıp uygulaymayacağını etkiler.Bir parça için CanCollide kapalı olsa bile, dokunma ve dokunmama olaylarını Touched ve TouchEnded etkinlikleri aracılığıyla tespit edebilirsiniz.
- The Touched ve TouchEnded olayları sadece fiziksel hareketin sonucu olarak ateş eder, bir parçanın bir diğer parçayla kesişmesine veya kesişmesini durdurmasına neden olan Position veya CFrame değişikliklerden değil.
- Üst düzey sınıfı, 'dan miras alır, böylece diğer ile çarpışıp çarpışmadığını belirlemek için 'e bir çarpışma grubu atayabilirsiniz, diğer vokellerinin Arazi 'ye çarpışıp çarpışmadığını belirlemek.
Dokundu
Touched etkinliği, bir BasePart ile başka bir ile temasa geçtiğinde veya bir Arazi vokeli ile temasa geçtiğinde ateşlenir.Sadece fiziksel simülasyon sonucu olarak ateş eder ve parçanın Position veya CFrame bir diğer parça veya voksel ile kesiştiği şekilde açıkça ayarlanırsa ateş etmez.
Aşağıdaki kod örneği, Touched etkinliğinin özel bir onTouched() fonksiyonuna nasıl bağlanabileceğini gösterir.Etkinin, çarpışmaya dahil olan diğer parçayı gösteren otherPart argümanını işlevine gönderdiğini unutmayın.
Parça çarpışması
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local function onTouched(otherPart)
print(part.Name .. " collided with " .. otherPart.Name)
end
part.Touched:Connect(onTouched)
Not that the Touched event can fire multiple times in quick succession based on subtle physical collisions, such as when a moving object "lands" into a resting position or when a collision involves a çok parçalı model .Gerekenden fazla etkinleştirilmesini engellemek için, bir örnek özniteliği aracılığıyla bir "bekleme" süresi uygulayan basit bir gecikme sistemi uygulayabilirsiniz.
Bekleme Süresi 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 .. " collided with " .. otherPart.Name)
part:SetAttribute("Touched", true) -- Özniteliği doğru olarak ayarla
task.wait(COOLDOWN_TIME) -- Bekleme süresi için bekle
part:SetAttribute("Touched", false) -- Özelliği sıfırla
end
end
part.Touched:Connect(onTouched)
Dokunma Sonlandı
The TouchEnded etkinliği, bir BasePart tüm çarpışma sınırlarının diğer bir BasePart veya doldurulmuş bir Arazi vokelin sınırlarından çıktığında ateşlenir.Sadece fiziksel simülasyon sonucu olarak ateş eder ve parçanın Position veya CFrame bir başka parçayla veya vokselle kesişmesini durduracak şekilde açıkça ayarlanırsa ateş etmez.
Aşağıdaki kod örneği, TouchEnded etkinliğinin özel bir onTouchEnded() fonksiyonuna nasıl bağlanabileceğini gösterir.Örneğin Touched gibi, olay otherPart argümanını işlevine gönderir ve diğer parçanın dahil olduğunu belirtir.
Çarpışma Almadan Tespit Etme
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " is no longer touching " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)
Çarpışma filtreleme
Çarpışma filtreleme fiziksel parçaların başkalarıyla çarpıştığını tanımlar.Birçok nesne için filtrelemeyi çarpışma grupları aracılığıyla yapabilir veya parça-parça üzerinde NoCollisionConstraint ile çarpışmaları kontrol edebilirsiniz.
Çarpışma grupları
Çarpışma grupları size özel gruplara atanmanızı sağlar ve diğer gruplardaki ile çarpışıp çarpımadıklarını belirlemenizi sağlar.Çatışmayan grupların içindeki parçalar, her iki parçanın da CanCollide özellik seti ile true olmasına rağmen birbirlerinden tamamen geçer.
Studio'nun Çarpışma Grupları Editörü üzerinden kolayca çarpışma grupları oluşturabilirsiniz, arayüz çubuğundaki Çarpışma Grupları düğmesine tıklayarak erişebilirsiniz.

Editör, List View içinde çalışır, bu da Studio'nun sol veya sağ tarafına yapışmayı tercih eder veya daha geniş bir Masa Görüntüsü , bu da yapışmayı üst veya alta tercih eder.

Grupları kaydet
Editör, yeniden adlandırılamayan veya silinemeyen bir Varsayılan çarpışma grubu içerir.Başka bir gruba atanmadığı sürece, tüm BaseParts otomatik olarak bu varsayılan gruba ait olur, yani Varsayılan gruptüm diğer nesnelerle çakışacaktır.
Yeni bir çarpışma grupoluşturmak için:
Düzenleyici panelin üst kısmındaki Grup Ekle düğmesine tıklayın, yeni bir grup adı girin ve Enter.Yeni grup, liste görünümünün her iki sütununda veya tablo görünümünün sol sütunu ve üst satırında görünür.
Gerekirse süreci tekrarlayın ve her grupbenzersiz ve tanımlayıcı bir isim seçin.Alanına tıklayarak veya seçerek bir grupadını geliştirme sırasında değiştirebildiğinizi unutmayın, ya da yeniden adlandırma düğmesine tıklayarak.
Grup çarpışmalarını yapılandır
Varsayılan yapılandırmada, tüm gruplardaki nesneler birbirlerine çarpışır.Bir grup içindeki nesnelerin başka bir gruptaki nesnelerle çarpışmasını engellemek için, bir grup içindeki kutuyu ilgili sütunda / sütunda seçilmez hale getirin.
Aşağıdaki örnekte, Küpler grubundaki nesneler çarpışmayacak Kapılar grupnesnelerle.

Nesneleri gruplara atama
Nesneleri, Studio editörü aracılığıyla kaydettiğin gruplara atamak için:
Bir veya daha fazla BaseParts çarpışma grupbir parçası olarak nitelendirilen seçin.
Onları sütunu için ⊕ düğmesine tıklayarak gruba atayın.Nesneler bir anda yalnızca bir çarpışma grubuna ait olabilir, bu nedenle onları yeni bir gruba yerleştirmek onları mevcut grupçıkarır.
Tahsis edildikten sonra, yeni grup nesnenin CollisionGroup özelliklerinin altında yansıtılır.

StüdyoSeçilebilir çarpışma grup
Studio'daki araçlar, 3B görüntü penceresine tıklarken seçim için aday olan nesneleri belirlemek için çarpışma filtreleme sistemini kullanır.Atanmış çarpışma grubu olmayan nesnelerin StudioSelectable ile çarpışması göz ardı edilecektir.
Örneğin, etkili alanları büyük saydam parçalar tarafından tanımlanan bir yarış deneyiminde kontrol noktalarına sahipseniz, bunları bir Kontrol noktaları çarpışma grubuna atayabilir ve ardından bu grubu StudioSelectable ile non-çarpışılabilir hale getirerek temel harita geometrisini düzenlerken yolda gelmesini engelleyebilirsiniz.

Eklenti kodu için, parçaları farenizin altında bulduğunuzda "StudioSelectable" çarpışma grubu filtresi olarak atamanız önerilir RaycastParams , kısımları bulurken.Bu, yerleşik Studio araçlarından beklenen seçim mekaniklerine uyması için eklentilerinizin yaratıcıların öğrendiği şeylerle eşleşmesine izin verir.
Önerilen Plugin Seçme Işını yayınlandı
local UserInputService = game:GetService("UserInputService")local Workspace = game:GetService("Workspace")local raycastParams = RaycastParams.new()raycastParams.CollisionGroup = "StudioSelectable" -- Konvansiyona uymak içinraycastParams.BruteForceAllSlow = true -- Böylece "false" olan CanQuery ile 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
çarpışma grupları kurmadan iki özel parçanın çarpışmasını engellemek için, araba tekerleği ve şasi arasında gibi, çarpışma yok sınırını düşünün.Avantajlar şunları içerir:
- Çarpışma grupları ve/veya yapılandırma senaryoları gerekmiyor, bu nedenle özelleştirilmiş çarpışma filtreleme ile kolayca model oluşturabilir ve paylaşabilirsiniz.
- Bağlı parçalar birbirlerine çarpışmayacak, ancak hala diğer nesnelerle çarpışabilirler.
Karakter çarpışmalarını devre dışı bırak
Roblox oyuncu karakterleri varsayılan olarak birbirlerine çarpışır.Bu, karakterlerin belirli alanlara ulaşmak için birbirlerinin üzerine atlaması gibi ilginç ancak kasıtsız oynanışdeneyimlerine yol açabilir.Bu davranış istenmezse, bunu Script içinde ServerScriptService ile engelleyebilirsin.
Script - Karakter çarpışmalarını devre dışı bırak
local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
local CollisionGroupName = "Characters"
PhysicsService:RegisterCollisionGroup(CollisionGroupName)
PhysicsService:CollisionGroupSetCollidable(CollisionGroupName, CollisionGroupName, false)
local function setCollisionGroup(model)
-- Modeldeki mevcut tüm parçalara çarpışma grubu uygulayın
for _, descendant in model:GetDescendants() do
if descendant:IsA("BasePart") then
descendant.CollisionGroup = CollisionGroupName
end
end
end
Players.PlayerAdded:Connect(function(player)
player.CharacterAdded:Connect(function(character)
setCollisionGroup(character)
end)
-- Oyuncunun zaten bir karakteri varsa, çarpışma grubunu hemen uygulayın
if player.Character then
setCollisionGroup(player.Character)
end
end)
Model çarpışmaları
Model nesneler, miras almadan parçalar için konteynerlerdir, bu yüzden doğrudan BasePart veya BasePart.Touched veya BasePart.TouchEnded etkinliklerine bağlanamazlar.Bir modelin çarpışma olaylarını tetikleyip tetiklemediğini belirlemek için, çocuklarını döngüye sokmanız ve özel onTouched() ve onTouchEnded() fonksiyonlarını her bir çocuğa bağlamanız gerekir BasePart .
Aşağıdaki kod örneği, çoklu parçalı bir modelin tüm BaseParts bölümlerini çarpışma olaylarına bağlar ve diğer parçalarla toplam çarpışma sayısını izler.
Model çarpışması
local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- Modelin kendisiyle kesişen durumlarını görmezden gel
if otherPart:IsDescendantOf(model) then return end
-- Dokunan model parçaları sayısını artır
numTouchingParts += 1
print(model.Name, "intersected with", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Modelin kendisiyle çakışmayan örneklerini görmezden gel
if otherPart:IsDescendantOf(model) then return end
-- Model parçaların dokunma sayısını azalt
numTouchingParts -= 1
print(model.Name, "un-intersected from", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
for _, child in model:GetChildren() do
if child:IsA("BasePart") then
child.Touched:Connect(onTouched)
child.TouchEnded:Connect(onTouchEnded)
end
end
Kafes ve katı model çarpışmaları
MeshPart ve PartOperation (parçalar katı modelleme tarafından birleştirilmiş) BasePart 'in alt sınıflarıdır, bu nedenle dokular ve katı modellenmiş parçalar aynı çarpışma etkinlikleri ve çarpışma filtreleme seçeneklerini normal parçalar gibi miras alır.Ancak, örüntü ve katı modellenmiş parçalar genellikle daha karmaşık geometrielere sahip olduğundan, fiziksel sınırların kolision için görsel temsil ile ne kadar doğru uyum sağladığını belirleyen ayırt edici bir CollisionFidelity özelliği vardır.
CollisionFidelity özelliğinin aşağıdaki seçenekleri vardır, en düşükten en yükseğe sadakat ve performans etkisi sırasında:
- Kutu — Küçük veya etkileşimsiz nesneler için ideal olan bağlayıcı çarpışma kutusu oluşturur
- Gövde — Daha az belirgin iz veya boşluklara sahip nesneler için uygun bir konveks kabuk üretir
- Varsayılan — Yarı ayrıntılı etkileşim gereksinimlerine sahip karmaşık nesneler için uygun bir yaklaşık çarpışma şekli üretir, konkavlığı destekler.
- Kesin Konveks Dönüşümü — En kesin sadakati sunar, ancak hala görselin 1:1 temsili değildir.Bu seçenek en pahalı performans maliyetine sahiptir ve motorun hesaplanması daha uzun sürer.

Çarpışma sadakati seçeneklerinin performans etkisi ve nasıl azaltılabileceği hakkında daha fazla bilgi için Performans optimizasyonu bakın.