Tabrakan

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Sebuah tabrakan terjadi ketika dua objek 3D bersentuhan di dalam dunia 3D. Untuk penanganan tabrakan yang disesuaikan, BasePart memiliki serangkaian peristiwa tabrakan dan teknik penyaringan tabrakan, sehingga Anda dapat mengontrol objek fisik mana yang bertabrakan dengan yang lain.

Peristiwa tabrakan

Peristiwa tabrakan terjadi ketika dua BaseParts bersentuhan atau berhenti bersentuhan di dunia 3D. Anda dapat mendeteksi tabrakan ini melalui peristiwa Touched dan TouchEnded yang terjadi terlepas dari nilai properti CanCollide dari masing-masing bagian. Saat mempertimbangkan penanganan tabrakan pada bagian, perhatikan hal berikut:

  • Properti CanTouch dari sebuah bagian menentukan apakah itu memicu peristiwa tabrakan. Jika diatur ke false, baik Touched maupun TouchEnded tidak akan dipicu.
  • Properti CanCollide dari sebuah bagian mempengaruhi apakah itu akan secara fisik bertabrakan dengan bagian lain dan menyebabkan gaya bekerja pada mereka. Bahkan jika CanCollide dinonaktifkan untuk sebuah bagian, Anda dapat mendeteksi sentuhan dan tidak-sentuhan melalui peristiwa Touched dan TouchEnded.
  • Peristiwa Touched dan TouchEnded hanya dipicu sebagai hasil dari gerakan fisik, bukan dari perubahan Position atau CFrame yang menyebabkan sebuah bagian berinteraksi atau berhenti berinteraksi dengan bagian lain.
  • Kelas tingkat atas Terrain mewarisi dari BasePart, sehingga Anda dapat menetapkan grup tabrakan ke Terrain untuk menentukan apakah BaseParts lain bertabrakan dengan voxel Terrain.

Touched

Peristiwa Touched dipicu ketika sebuah BasePart bersentuhan dengan yang lain, atau dengan voxel Terrain. Itu hanya dipicu sebagai hasil dari simulasi fisik dan tidak akan dipicu ketika Position atau CFrame bagian diatur secara eksplisit sehingga berinteraksi dengan bagian atau voxel lain.

Pola kode berikut menunjukkan bagaimana peristiwa Touched dapat dihubungkan ke fungsi kustom onTouched(). Perhatikan bahwa peristiwa ini 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 .. " bertabrakan dengan " .. otherPart.Name)
end
part.Touched:Connect(onTouched)

Perhatikan bahwa peristiwa Touched dapat dipicu beberapa kali dalam waktu singkat berdasarkan tabrakan fisik yang halus, seperti ketika objek bergerak "menetap" ke posisi istirahat atau ketika tabrakan melibatkan model multi-bagian. Untuk menghindari pemicu lebih banyak peristiwa Touched daripada yang diperlukan, Anda dapat menerapkan sistem debounce sederhana yang memberlakukan periode "cooldown" melalui sebuah atribut.

Tabrakan Bagian Dengan Cooldown
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 .. " bertabrakan dengan " .. otherPart.Name)
part:SetAttribute("Touched", true) -- Atur atribut ke true
task.wait(COOLDOWN_TIME) -- Tunggu durasi cooldown
part:SetAttribute("Touched", false) -- Reset atribut
end
end
part.Touched:Connect(onTouched)

TouchEnded

Peristiwa TouchEnded dipicu ketika seluruh batas tabrakan dari sebuah BasePart keluar dari batas BasePart lain atau voxel Terrain yang terisi. Itu hanya dipicu sebagai hasil dari simulasi fisik dan tidak akan dipicu ketika Position atau CFrame bagian diatur secara eksplisit sehingga berhenti berinteraksi dengan bagian atau voxel lain.

Pola kode berikut menunjukkan bagaimana peristiwa TouchEnded dapat dihubungkan ke fungsi kustom onTouchEnded(). Seperti Touched, peristiwa ini 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 .. " tidak lagi bersentuhan dengan " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)

Penyaringan tabrakan

Penyaringan tabrakan mendefinisikan bagian fisik mana yang bertabrakan dengan yang lain. Anda dapat mengonfigurasi penyaringan untuk banyak objek melalui grup tabrakan atau Anda dapat mengontrol tabrakan pada basis bagian-ke-bagian dengan instansi NoCollisionConstraint.

Grup tabrakan

Grup tabrakan memungkinkan Anda menetapkan BaseParts ke grup yang ditentukan dan menentukan apakah mereka bertabrakan dengan objek di grup lain. Bagian dalam grup yang tidak bertabrakan akan melewati satu sama lain sepenuhnya, bahkan jika kedua bagian memiliki properti CanCollide diatur ke true.

Dalam video di atas, objek berputar berada dalam grup tabrakan yang berbeda sehingga mereka bertabrakan dengan objek warna lain tetapi tidak dengan objek warna mereka sendiri

Anda dapat dengan mudah mengatur grup tabrakan melalui editor Grup Tabrakan di Studio, yang dapat diakses melalui menu Jendela ⟩ 3D di Studio.

Editor berfungsi dalam Tampilan Daftar yang lebih menyukai penempatan di sisi kiri atau kanan Studio, atau dalam Tampilan Tabel yang lebih lebar, yang lebih menyukai penempatan di bagian atas atau bawah.

Contoh Tampilan Daftar di Editor Grup Tabrakan

Daftarkan grup

Editor ini mencakup satu grup tabrakan Default yang tidak dapat diubah namanya atau dihapus. Semua BaseParts secara otomatis termasuk dalam grup default ini kecuali ditetapkan ke grup lain, yang berarti bahwa mereka akan bertabrakan dengan semua objek lain di grup Default.

Untuk membuat grup tabrakan baru:

  1. Klik tombol Tambah Grup di bagian atas panel editor, masukkan nama grup baru, dan tekan Enter. Grup baru akan muncul di kedua kolom tampilan daftar, atau di kolom kiri dan baris atas tampilan tabel.

    Grup baru ditambahkan ke Editor Grup Tabrakan di Tampilan Daftar
  2. Ulangi proses ini jika perlu, memilih nama yang unik dan deskriptif untuk setiap grup. Perhatikan bahwa Anda dapat mengubah nama grup selama pengembangan dengan mengklik di bidangnya, atau dengan memilihnya dan mengklik tombol ubah nama.

    Tombol dan bidang yang ditunjukkan untuk mengubah nama grup di Editor Grup Tabrakan

Konfigurasi tabrakan grup

Di bawah konfigurasi default, objek dalam semua grup bertabrakan satu sama lain. Untuk mencegah objek dalam satu grup bertabrakan dengan objek dalam grup lain, hapus centang kotak di baris/kolom yang sesuai.

Dalam contoh berikut, objek dalam grup Cubes tidak akan bertabrakan dengan objek dalam grup Doors.

Grup dikonfigurasi di Tampilan Daftar Editor Grup Tabrakan

Menetapkan objek ke grup

Untuk menetapkan objek ke grup yang telah Anda daftarkan melalui editor Studio:

  1. Pilih satu atau lebih BaseParts yang memenuhi syarat sebagai bagian dari grup tabrakan.

  2. Tetapkan mereka ke grup dengan mengklik tombol untuk barisnya. Objek hanya dapat termasuk dalam satu grup tabrakan pada satu waktu, jadi menempatkan mereka dalam grup baru akan menghapus mereka dari grup saat ini.

    Tombol Plus ditunjukkan di Editor Grup Tabrakan untuk menambahkan bagian yang dipilih ke grup

Setelah ditetapkan, grup baru akan tercermin di properti CollisionGroup objek tersebut.

Grup tabrakan yang dipilih ditunjukkan sebagai properti CollisionGroup bagian

Grup tabrakan StudioSelectable

Alat di Studio menggunakan sistem penyaringan tabrakan untuk menentukan objek mana yang menjadi kandidat untuk dipilih saat mengklik di viewport 3D. Objek yang grup tabrakannya yang ditetapkan tidak bertabrakan dengan StudioSelectable akan diabaikan.

Sebagai contoh, jika Anda memiliki checkpoint dalam permainan balap yang area efektifnya didefinisikan oleh bagian transparan besar, Anda dapat menetapkannya ke grup tabrakan Checkpoints dan kemudian membuat grup itu tidak dapat bertabrakan dengan StudioSelectable sehingga tidak mengganggu saat Anda mengedit geometri peta yang mendasarinya.

Grup Checkpoints dikonfigurasi untuk tidak dapat bertabrakan dengan grup StudioSelectable

Untuk kode plugin, disarankan agar Anda menetapkan "StudioSelectable" sebagai filter grup tabrakan dari RaycastParams Anda saat mencari bagian di bawah kursor. Ini memungkinkan plugin Anda untuk mencocokkan mekanika pemilihan yang telah dipelajari oleh pembuat untuk diharapkan dari alat Studio bawaan.

Raycast Pemilihan Plugin yang Direkomendasikan
local UserInputService = game:GetService("UserInputService")
local Workspace = game:GetService("Workspace")
local raycastParams = RaycastParams.new()
raycastParams.CollisionGroup = "StudioSelectable" -- Untuk mengikuti konvensi
raycastParams.BruteForceAllSlow = true -- Agar bagian dengan CanQuery "false" dapat dipilih
local mouseLocation = UserInputService:GetMouseLocation()
local mouseRay = Workspace.CurrentCamera:ViewportPointToRay(mouseLocation.X, mouseLocation.Y)
local filteredSelectionHit = Workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 10000, raycastParams)

Penyaringan bagian-ke-bagian

Untuk mencegah tabrakan antara dua bagian tertentu tanpa menyiapkan grup tabrakan, seperti antara roda kendaraan dan sasisnya, pertimbangkan kendala No Collision. Keuntungannya termasuk:

  • Grup tabrakan dan/atau skrip konfigurasi tidak diperlukan, sehingga Anda dapat dengan mudah membuat dan membagikan model dengan penyaringan tabrakan yang disesuaikan.
  • Bagian yang 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 dapat menyebabkan permainan yang menarik tetapi tidak diinginkan, seperti karakter melompat di atas satu sama lain untuk mencapai area tertentu. Jika perilaku ini tidak diinginkan, Anda dapat mencegahnya melalui Script berikut di ServerScriptService.

Skrip - Nonaktifkan Tabrakan Karakter
local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
PhysicsService:RegisterCollisionGroup("Characters")
PhysicsService:CollisionGroupSetCollidable("Characters", "Characters", false)
local function onDescendantAdded(descendant)
-- Atur grup tabrakan untuk setiap bagian keturunan
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Characters"
end
end
local function onCharacterAdded(character)
-- Proses keturunan yang ada dan baru untuk pengaturan fisika
for _, descendant in character:GetDescendants() do
onDescendantAdded(descendant)
end
character.DescendantAdded:Connect(onDescendantAdded)
end
Players.PlayerAdded:Connect(function(player)
-- Deteksi ketika karakter pemain ditambahkan
player.CharacterAdded:Connect(onCharacterAdded)
end)

Tabrakan model

Objek Model adalah wadah untuk bagian daripada mewarisi dari BasePart, sehingga mereka tidak dapat langsung terhubung ke peristiwa BasePart.Touched atau BasePart.TouchEnded. Untuk menentukan apakah sebuah model memicu peristiwa tabrakan, Anda perlu melakukan loop melalui anak-anaknya dan menghubungkan fungsi kustom onTouched() dan onTouchEnded() ke setiap anak BasePart.

Contoh kode berikut menghubungkan semua BaseParts dari model multi-bagian ke peristiwa tabrakan dan melacak jumlah total tabrakan dengan bagian lain.

Tabrakan Model
local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- Abaikan instansi model yang berinteraksi dengan dirinya sendiri
if otherPart:IsDescendantOf(model) then return end
-- Tingkatkan jumlah bagian model yang bersentuhan
numTouchingParts += 1
print(model.Name, "berinteraksi dengan", otherPart.Name, "| Bagian model yang bersentuhan:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Abaikan instansi model yang tidak berinteraksi dengan dirinya sendiri
if otherPart:IsDescendantOf(model) then return end
-- Kurangi jumlah bagian model yang bersentuhan
numTouchingParts -= 1
print(model.Name, "tidak berinteraksi lagi dengan", otherPart.Name, "| Bagian model yang bersentuhan:", numTouchingParts)
end
for _, child in model:GetChildren() do
if child:IsA("BasePart") then
child.Touched:Connect(onTouched)
child.TouchEnded:Connect(onTouchEnded)
end
end

Tabrakan mesh dan model padat

MeshPart dan PartOperation (bagian yang digabungkan melalui pemodelan padat) adalah subclass dari BasePart, sehingga mesh dan bagian yang dimodelkan padat mewarisi opsi peristiwa tabrakan dan penyaringan tabrakan yang sama seperti bagian biasa. Namun, karena mesh dan bagian yang dimodelkan padat biasanya memiliki geometri yang lebih kompleks, mereka memiliki properti CollisionFidelity yang menentukan seberapa tepat batas fisik sejajar dengan representasi visual untuk penanganan tabrakan.

Properti CollisionFidelity memiliki opsi berikut, dalam urutan fidelitas dan dampak kinerja dari yang terendah hingga tertinggi:

  • Box — Membuat kotak tabrakan pembatas, ideal untuk objek kecil atau tidak interaktif.
  • Hull — Menghasilkan cangkang cembung, cocok untuk objek dengan lekukan atau rongga yang kurang mencolok.
  • Default — Menghasilkan bentuk tabrakan yang mendekati yang mendukung kekonkavan, cocok untuk objek kompleks dengan kebutuhan interaksi semi-rinci.
  • PreciseConvexDecomposition — Menawarkan fidelitas paling tepat tetapi tetap bukan representasi 1:1 dari visual. Opsi ini memiliki biaya kinerja yang paling mahal dan memerlukan waktu lebih lama bagi mesin untuk menghitung.
Mesh asli dari menara kastil

Untuk informasi lebih lanjut tentang dampak kinerja dari opsi fidelitas tabrakan dan cara menguranginya, lihat Optimasi kinerja.

©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.