Tabrakan terjadi ketika dua objek 3D masuk kontak dalam dunia 3D.Untuk penanganan tabrakan khusus, BasePart memiliki serangkaian peristiwa tabrakan dan teknik penyaringan tabrakan sehingga Anda dapat mengontrol asamble fisik mana yang bertabrakan dengan orang lain.
Peristiwa kolisi
Kolisi peristiwa terjadi ketika dua BaseParts berhenti menyentuh di dunia 3D.Anda dapat mendeteksi kolisi ini melalui acara Touched dan TouchEnded yang terjadi terlepas dari nilai properti bagian mana pun CanCollide.Saat mempertimbangkan penanganan tabrakan pada bagian, perhatikan hal mengikuti:
- Properti bagian CanTouch menentukan apakah itu memicu peristiwa tabrakan. Jika diatur ke false, tidak ada Touched atau TouchEnded yang akan ditembak.
- Properti bagian CanCollide mempengaruhi apakah akan secara fisik bertabrakan dengan bagian lain dan menyebabkan kekuatan bertindak terhadap mereka.Bahkan jika CanCollide dinonaktifkan untuk bagian, Anda dapat mendeteksi sentuhan dan non-sentuhan melalui Touched dan TouchEnded peristiwa.
- Peristiwa Touched dan TouchEnded hanya terbakar sebagai hasil dari gerakan fisik , bukan dari perubahan Position atau CFrame yang menyebabkan bagian bertabrakan atau berhenti bertabrakan dengan bagian lain.
- Kelas tingkat atas mendapatkan warisan dari , jadi Anda dapat menugaskan kelompok kolisi ke untuk menentukan apakah kolisi lain bertabrakan dengan voksels Tanah .
Disentuh
Peristiwa Touched terjadi ketika sebuah BasePart berhubungan dengan yang lain, atau dengan vokel Tanah.Ini hanya menembak sebagai hasil dari simulasi fisik dan tidak akan menembak ketika bagiannya Position atau CFrame ditetapkan secara eksplisit sehingga berinteraksi dengan bagian atau vokel lain.
Pola kode berikut menunjukkan bagaimana acara Touched dapat terhubung ke fungsi khusus onTouched().Perhatikan bahwa acara mengirim argumen otherPart ke fungsi, menunjukkan bagian lain yang terlibat dalam tabrakan.
Tabrakan Bagian
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)
Perhatikan bahwa acara Touched dapat menembak beberapa kali dalam urutan singkat berdasarkan kolisi fisik halus, seperti ketika objek bergerak "menetap" ke posisi beristirahat atau ketika kolisi melibatkan model multi-bagian.Untuk menghindari memicu lebih banyak acara daripada yang diperlukan, Anda dapat menerapkan sistem debounce sederhana yang memaksakan periode "cooldown" melalui atribut instance .
Tabrakan Bagian dengan Masa Istirahat
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) -- Atur atribut ke benar
task.wait(COOLDOWN_TIME) -- Tunggu durasi pendinginan
part:SetAttribute("Touched", false) -- Setel ulang atribut
end
end
part.Touched:Connect(onTouched)
SentuhBerakhir
Peristiwa TouchEnded terjadi ketika seluruh batas tabrakan dari BasePart keluar dari batas lain BasePart atau voxel Tanah yang diisi.Ini hanya menembak sebagai hasil dari simulasi fisik dan tidak akan menembak ketika bagiannya Position atau CFrame diatur secara eksplisit sehingga berhenti bertabrakan dengan bagian atau vokel lain.
Pola kode berikut menunjukkan bagaimana acara TouchEnded dapat terhubung ke fungsi khusus onTouchEnded().Seperti Touched , acara mengirim argumen otherPart ke fungsi, menunjukkan bagian lain yang terlibat.
Deteksi Non-Tabrakan
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)
Filterisasi kolisi
Kolisi filterisasi mendefinisikan bagian fisik mana yang bertabrakan dengan orang lain.Anda dapat mengonfigurasi filter untuk banyak objek melalui kelompok kolisi atau Anda dapat mengontrol kolisi pada basis bagian ke bagian dengan NoCollisionConstraint.
Kelompok kolisi
Tabrakan grup memungkinkan Anda menugaskan BaseParts ke grup khusus dan menentukan apakah mereka bertabrakan dengan yang di grup lain atau tidak.Bagian dalam kelompok yang tidak bertabrakan lulus satu sama lain sepenuhnya, bahkan jika kedua bagian memiliki set properti CanCollide mereka ke true .
Anda dapat dengan mudah mengatur grup kolisi melalui Editor Grup Kolisi Studio , yang dapat diakses dengan mengklik tombol Grup Kolisi di tab Model di bilah alat.

Editor berfungsi di antara Tampilan Daftar yang memfavoritkan doking ke sisi kiri atau kanan Studio, atau di Tampilan Tabel yang lebih luas , yang memfavoritkan doking ke bagian atas atau bawah.

Daftarkan grup
Editor termasuk satu grup kolisi Standar yang tidak dapat diubah atau dihapus.Semua BaseParts secara otomatis termasuk dalam kelompok default ini kecuali ditugaskan ke kelompok lain, yang berarti mereka akan bertabrakan dengan semua objek lain di kelompok Default .
Untuk membuat grupkolisi baru:
Klik tombol Tambahkan Grup di bagian atas panel editor, masukkan nama grup baru, dan tekan Enter.Kelompok baru muncul di kedua kolom tampilan daftar, atau di kedua kolom kiri dan atas tampilan tabel.
Ulangi proses jika diperlukan, memilih nama unik dan deskriptif untuk setiap kelompok.Perhatikan bahwa Anda dapat mengubah nama grup selama pengembangan dengan mengklik di bidangnya, atau dengan memilihnya dan mengklik tombol ganti nama .
Konfigurasi konflik kelompok
Di bawah konfigurasi default, objek di semua kelompok bertabrakan satu sama lain.Untuk mencegah objek dalam satu kelompok bertabrakan dengan objek di gruplain, tidak memeriksa kotak di baris/kolom masing-masing.
Dalam contoh berikut, objek di kelompok Kubus tidak akan bertabrakan dengan objek di grupPintu .

Ambil objek untuk kelompok
Untuk menugaskan objek ke kelompok yang telah daftar melalui editor Studio:
Pilih satu atau lebih BaseParts yang memenuhi syarat sebagai bagian dari grupkolisi.
Atribusikan ke kelompok dengan mengklik tombol ⊕ untuk barisnya.Objek hanya dapat menjadi bagian dari satu kelompok tabrakan pada satu waktu, jadi menempatkannya di grup baru menghapusnya dari grup saat ini.
Setelah ditugaskan, kelompok baru dicerminkan di bawah properti objek CollisionGroup.

grupkolisi yang dapat dipilih di studio
Alat di Studio menggunakan sistem penyaringan kolisi untuk menentukan objek mana yang menjadi kandidat untuk dipilih saat mengklik di jendela 3D.Objek yang grup tabrakan yang ditugaskan tidak tidak bertabrakan dengan StudioSelectable akan diabaikan.
Sebagai contoh, jika Anda memiliki titik pemeriksaan dalam pengalaman balap yang daerah efektifnya didefinisikan oleh bagian transparan besar, Anda dapat menugaskannya ke grup kolisi Titik pemeriksaan yang tidak bertabrakan dengan StudioSelectable sehingga mereka tidak mendapatkan di jalan saat Anda mengedit geometri peta dasar.

Untuk kode plugin, disarankan agar Anda menetapkan "StudioSelectable" sebagai filter grup tabrakan dari RaycastParams saat menemukan bagian di bawah kursor.Ini memungkinkan plugin Anda untuk mencocokkan mekanisme seleksi yang telah dipelajari pembuat untuk diharapkan dari alat Studio bawaan.
Raycast Pilihan Plugin Direkomendasikan
local UserInputService = game:GetService("UserInputService")local Workspace = game:GetService("Workspace")local raycastParams = RaycastParams.new()raycastParams.CollisionGroup = "StudioSelectable" -- Untuk mengikuti konvensiraycastParams.BruteForceAllSlow = true -- Jadi bagian dengan CanQuery "false" dapat dipilihlocal mouseLocation = UserInputService:GetMouseLocation()local mouseRay = Workspace.CurrentCamera:ViewportPointToRay(mouseLocation.X, mouseLocation.Y)local filteredSelectionHit = Workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 10000, raycastParams)
Filterasi bagian ke bagian
Untuk mencegah tabrakan antara dua bagian spesifik tanpa mengatur kelompok tabrakan, seperti antara roda kendaraan dan chassisnya, pertimbangkan batasan Tidak ada tabrakan.Keuntungan termasuk:
- Grup kolisi dan/atau skrip konfigurasi tidak diperlukan, sehingga Anda dapat dengan mudah membuat dan berbagi model dengan penyaringan kolisi yang disesuaikan.
- Bagian terhubung tidak akan bertabrakan satu sama lain, tetapi mereka masih dapat bertabrakan dengan objek lain.
Nonaktifkan tabrakan karakter
Karakter pemain Roblox bertabrakan satu sama lain secara default.Ini bisa menyebabkan gameplaymenarik tetapi tidak disengaja, seperti karakter melompat di atas satu sama lain untuk mencapai area tertentu.Jika perilaku ini tidak diinginkan, Anda dapat mencegahnya melalui berikut Script di ServerScriptService .
Skrip - Nonaktifkan Tabrakan Karakter
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)
-- Terapkan grup tabrakan ke semua bagian yang ada di model
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)
-- Jika pemain sudah memiliki karakter, terapkan grup kolisi segera
if player.Character then
setCollisionGroup(player.Character)
end
end)
Tabrakan model
Model objek adalah wadah untuk bagian daripada mewarisi dari BasePart , jadi mereka tidak dapat terhubung langsung ke BasePart.Touched atau BasePart.TouchEnded peristiwa.Untuk menentukan apakah model memicu peristiwa tabrakan, Anda perlu melalui anak-anaknya dan menghubungkan fungsi khusus onTouched() dan onTouchEnded() ke setiap anak BasePart .
Contoh kode berikut menghubungkan semua BaseParts dari model multi-bagian ke peristiwa tabrakan dan melacak jumlah tabrakan total dengan bagian lain.
Tabrakan Model
local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- Abaikan instansi model yang berinterseksi dengan dirinya sendiri
if otherPart:IsDescendantOf(model) then return end
-- Tingkatkan jumlah bagian model yang disentuh
numTouchingParts += 1
print(model.Name, "intersected with", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Abaikan instansi model yang tidak berinterseksi dengan dirinya sendiri
if otherPart:IsDescendantOf(model) then return end
-- Kurangi jumlah bagian model yang bersentuhan
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
Tabrakan model mesh dan padat
MeshPart dan PartOperation (bagian yang disatukan oleh pemodelan padat ) adalah kelas turunan dari BasePart , jadi meshes dan bagian yang diproses solid mewarisi opsi kolisi dan penyaringan kolisi yang sama seperti bagian biasa.Namun, karena meshes dan bagian berbentuk solid biasanya memiliki geometri yang lebih kompleks, mereka memiliki properti unik CollisionFidelity yang menentukan seberapa tepat batas fisik sesuai dengan representasi visual untuk penanganan kolisi.
Properti CollisionFidelity memiliki opsi berikut, dalam urutan ketepatan dan dampak kinerja dari terendah ke tertinggi:
- Kotak — Membuat kotak kolisi batas, ideal untuk objek kecil atau non-interaktif.
- Hull — Menghasilkan hull konkav, cocok untuk objek dengan indelasi atau lubang yang kurang terlihat.
- Standar — Menghasilkan bentuk tabrakan yang kasar yang mendukung konkavitas, cocok untuk objek kompleks dengan kebutuhan interaksi semi terperinci.
- Pemecahan Konveks Akurat — Menawarkan kesetiaan paling akurat tetapi masih bukan representasi 1:1 dari visual.Opsi ini memiliki biaya kinerja paling mahal dan membutuhkan lebih lama bagi mesin untuk dihitung.

Untuk informasi lebih lanjut tentang dampak kinerja pada opsi keandalan kolisi dan cara mengatasinya, lihat Optimisasi kinerja.