Sebuah tabrakan terjadi ketika dua objek 3D berinteraksi di dalam dunia 3D. Untuk menangani tabrakan yang dikustomisasi, BasePart memiliki set event tabrakan dan 1> filtering tabrakan1> teknik, sehingga Anda dapat mengontrol apa kumpulan fisik yang bertabrakan dengan orang lain.
Acara Tabrakan
Kolisi acara terjadi ketika dua BaseParts sentuh atau berhenti sentuh di dunia 3D. Anda dapat mendeteksi kolisi ini melalui Touched
- Properti bagian CanCollide menentukan apakah itu akan secara fisik bertabrakan dengan bagian lain dan menyebabkan kekuatan bertindak pada mereka. Bahkan jika Class.
- Acara Touched dan TouchEnded hanya diaktifkan sebagai hasil dari gerakan fisik , bukan dari perubahan 1> Class.BasePart.Position|Position1> atau 4> Class.BasePart.
- Kelas Terrain tingkat atas mewarisi dari BasePart , jadi Anda dapat menetapkan kelas kelompok tabrakan untuk 1> Class.Terrain1> untuk menentukan apakah 4> Class.BasePart|BaseParts4> lainnya bertabrakan
Ditakuti
Acara Touched terjadi ketika sebuah BasePart berada dalam kontak dengan yang lain, atau dengan voxel Tanah. Itu hanya terj
Mata uang asing pada umumnya adalah Forex.Touched|Touched, yang merupakan kode pemotongan rumput pada umumnya. Mata uang ini umumnya dibagi menjadi beberapa kelompok, yang masing-masing disebut Touched dan onTouched(). Javascript adalah bahasa pemrograman yang digunakan untuk menulis kode pem
Tabrakan Bagian
local part = workspace.Part
local function onTouched(otherPart)
print(part.Name .. " collided with " .. otherPart.Name)
end
part.Touched:Connect(onTouched)
Catat bahwa acara Touched dapat menembak berkali-kali dalam waktu cepat berdasarkan beberapa kali kollisi fisik, seperti ketika objek bergerak "settles" ke posisi beristirahat atau ketika koll
Tabrakan Bagian Dengan Cooldown
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) -- Tetapkan属性 ke true
task.wait(COOLDOWN_TIME) -- Tunggu durasi cooldown
part:SetAttribute("Touched", false) -- Atur ulang atribut
end
end
part.Touched:Connect(onTouched)
Selesai
Acara TouchEnded terjadi ketika seluruh batas-batas kolisi sebuah BasePart keluar d
Meskipun pola kode berikut menunjukkan cara acara TouchEnded dapat terhubung ke fungsi khusus onTouchEnded(). Seperti Touched, acara mengirim argument 1> otherPart1> ke fungsi, menunjukkan bahwa bagian lain terlibat.
Deteksi Non-Kolisi
local part = workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " is no longer touching " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)
Fitur Anti-Tabrakan
Kolisi filtering mendefinisikan bagian mana yang bertabrakan dengan orang lain. Anda dapat mengkonfigurasikan filtering untuk berbagai objek melalui kelompok kolisi atau Anda dapat mengontrol kolisi di basis porta-ke-porta dengan 1> Class.NoCollisionConstraint1> instans.
Grup Tabrakan
Kolisi grup memungkinkan Anda menetapkan BaseParts ke grup yang didedikasikan dan spesifikasi apakah atau tidak mereka bertabrakan dengan orang-orang dalam grup lain. Bagian dalam grup non-kolision mengatasi satu sama lain sepenuhnya, bahkan jika kedua bagian memiliki set
Anda dapat dengan mudah mengatur kelompok tabrakan melalui Studio's Editor Grup Tabrakan, yang dapat diakses dengan menekan tombol Grup Tabrakan di tab Model.
Fungsi editor dalam Tampilan Daftar yang menyukai dokasi ke kiri atau kanan Studio, atau dalam Tampilan Lebar yang menyukai dokasi ke atas atau bawah.
Mendaftar Grup
Editor mencakup satu kumpulan Default kelompok yang tidak dapat diubah atau dihapus. Semua BaseParts secara otomatis mengeklaim kelompok ini ke grup ini, yang berarti mereka akan bertabrakan dengan semua objek lain dalam kelompok Standar .
Untuk membuat gruptabrakan baru:
Klik tombol Tambahkan Grup di bagian atas panel editor, masukkan nama grup baru, dan tekan Masuk. Grup baru muncul di kedua kolom tampilan daftar, atau di kedua kolom tampilan tabel.
Ulangi proses jika perlu, memilih nama yang unik dan deskriptif untuk setiap grup. Catat bahwa Anda dapat mengubah nama grupselama pengembangan dengan mengklik di bidangnya, atau dengan memilihnya dan mengklik tombol ubah nama .
Mengkonfigurasi Tabrakan Grup
Dalam konfigurasi default, objek di semua grup bertabrakan satu sama lain. Untuk menghindari objek di satu grup dari objek di grup lain, bertukar pemeriksaan kotak di baris/kolom masing-masing.
Dalam contoh berikut, objek dalam kelompok Kubus tidak akan bentro dengan objek dalam kelompok grup.
Menetapkan Objek ke Grup
Untuk menetapkan objek ke grup yang Anda telah daftar melalui editor Studio:
Pilih satu atau lebih BaseParts yang memenuhi kualifikasi sebagai bagian dari gruptabrakan.
A割り当て mereka ke grup dengan mengklik tombol ⊕ untuk barisnya. Objek dapat mengeklaim hanya satu kelompok tabrakan pada satu waktu, jadi menempatkannya di kelompok baru menghapus mereka dari kelompok mereka saat ini.
Setelah diberikan, kelompok baru dapat dilihat di bawah properti CollisionGroup objek.
Grup Tabrakan yang Dapat Dipilih
Alat di Studio menggunakan sistem filtering tabrakan untuk menentukan objek mana yang menjadi kandidat pemilihan saat klik di jendela 3D. Objek yang asign grup tabrakan akan tidak bertabrakan dengan StudioSelectable akan diabaikan.
Misalnya, jika Anda memiliki checkpoint dalam pengalaman balap yang cuacanya efektif dibagi oleh bagian transparan besar, Anda dapat menetapkan mereka ke grup Checkpoint dan kemudian membuat grup itu tidak bertabrakan dengan StudioSelectable sehingga mereka tidak muncul ketika Anda mengedit geometri peta dasar.
Untuk kode plugin, disarankan agar Anda menetapkan "StudioSelectable" sebagai filter kelompok kolisi dari RaycastParams saat menemukan bagian di bawah kurungan. Ini memungkinkan plugin Anda untuk menyinkronkan mekanik pemilihan yang dibayar pengguna harapkan dari alat Studio bawaan.
Recommended Plugin Selection Raycast
local UserInputService = game:GetService("UserInputService")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)
Pen-Filteran Bagian-Bagian
Untuk mencegah tabrakan antara dua bagian spesifik tanpa menetapkan kelompok tabrakan, seperti antara roda kendaraan dan chassisnya, pertimbangkan batas Tidak Ada Tabrakan. Keuntungan termasuk:
- Grup kollisi dan/atau naskah konfigurasi tidak diperlukan, jadi Anda dapat dengan mudah membuat dan berbagi model dengan filter kollisi yang disesuaikan.
- Bagian yang terhubung tidak akan bertabrakan satu sama lain, tetapi mereka masih dapat bertabrakan dengan objek lain.
Menonaktifkan Tabrakan Karakter
Karakter pemain Roblox bertabrakan satu sama lain secara default. Ini dapat menyebabkan gameplay yang menarik tetapi tidak sengaja, seperti karakter yang melompat di atas satu sama lain untuk mencapai area tertentu. Jika perilaku ini tidak diinginkan, Anda dapat mencegahnya melalui Class.Script Script berikut.
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)
-- Tetapkan grup kolisi untuk setiap bagian yang turun
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Characters"
end
end
local function onCharacterAdded(character)
-- Mengolah leluhur 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 saat karakter pemain ditambahkan
player.CharacterAdded:Connect(onCharacterAdded)
end)
Tabrakan Model
Model objek adalah wadah untuk bagian daripada mewarisi dari BasePart , jadi mereka tidak dapat langsung terhubung ke Class.BasePart.Tou
Contoh kode berikut menghubungkan semua BaseParts dari model multi-bagian ke acara 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 bertindak saling bertindak dengan dirinya sendiri
if otherPart:IsDescendantOf(model) then return end
-- Tingkatkan jumlah bagian model yang ber触
numTouchingParts += 1
print(model.Name, "intersected with", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Abaikan instansi model berdudukan dengan sendirinya
if otherPart:IsDescendantOf(model) then return end
-- Kurangi jumlah bagian model yang ber触
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 Antara Mesh dan Solid
MeshPart dan PartOperation (bagian yang bergabung dengan meshes solid ) adalah subklasifikasi dari <
Properti CollisionFidelity memiliki opsi berikut, dalam urutan fidelitas dan dampak kinerja dari yang terendah ke yang tertinggi:
- Kotak ” — Menciptakan kotak tabrakan batas, ideal untuk objek kecil atau non-interaktif.
- Hull — Menghasilkan hull konvektör, cocok untuk objek dengan geser yang kurang terlihat atau lubang.
- Standar — Menghasilkan bentuk tabrakan yang kira-kira yang mendukung konvektorsi, cocok untuk objek kompleks dengan kebutuhan interaksi semi-terperinci.
- PreciseConvexDecomposition — Menawarkan ketelitian tingkat tertinggi tetapi masih bukan representasi 1: 1 dari visual. Opsi ini memiliki biaya kinerja paling mahal dan memakan waktu lebih lama bagi mesin untuk menghitung.
Untuk lebih banyak informasi tentang dampak kinerja dari pilihan kesesuaian kebocoran dan cara menguranginya, lihat Optimisasi Kinerja. Untuk jalan kaki lengkap tentang cara memilih pilihan kebocoran yang menyeimbangkan kebutuhan presisi dan persyaratan kinerja Anda, lihat di sini .