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 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 CanTouch sebuah bagian menentukan apakah itu mengaktifkan acara bertabrakan. Jika diatur ke false, tidak ada Touched atau 1> Class.BasePart.TouchEnded|TouchEnded1> yang akan diaktifkan.
  • 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

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

Anda dapat dengan mudah mengatur kelompok tabrakan melalui Studio's Editor Grup Tabrakan, yang dapat diakses dengan menekan tombol Grup Tabrakan di tab Model.

Collision Groups tool indicated in Model tab of Studio

Fungsi editor dalam Tampilan Daftar yang menyukai dokasi ke kiri atau kanan Studio, atau dalam Tampilan Lebar yang menyukai dokasi ke atas atau bawah.

List View example in Collision Groups Editor

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:

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

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

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

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.

Group configured in List View of Collision Groups Editor

Menetapkan Objek ke Grup

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

  1. Pilih satu atau lebih BaseParts yang memenuhi kualifikasi sebagai bagian dari gruptabrakan.

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

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

Setelah diberikan, kelompok baru dapat dilihat di bawah properti CollisionGroup objek.

Chosen collision group indicated as the part's CollisionGroup property

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.

Checkpoints group configured to be non-collidable with StudioSelectable group

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 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)

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

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 .