Tabrakan

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

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 .

Dalam video di atas, objek berputar berada di berbagai kelompok tabrakan sehingga mereka bertabrakan dengan objek warna lain tetapi tidak dengan objek warna mereka sendiri

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.

Collision Groups tool indicated in Model tab of Studio

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.

List View example in Collision Groups Editor

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:

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

    New group added to Collision Groups Editor in List View
  2. 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 .

    Button and field indicated for renaming a group in the Collision Groups Editor

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 .

Group configured in List View of Collision Groups Editor

Ambil objek untuk kelompok

Untuk menugaskan objek ke kelompok yang telah daftar melalui editor Studio:

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

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

    Plus button indicated in Collision Groups Editor for adding selected parts to a group

Setelah ditugaskan, kelompok baru dicerminkan di bawah properti objek CollisionGroup.

Chosen collision group indicated as the part's CollisionGroup property

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.

Checkpoints group configured to be non-collidable with StudioSelectable group

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 konvensi
raycastParams.BruteForceAllSlow = true -- Jadi 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)

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.
Original mesh of castle tower

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