Si verifica una collisione quando due oggetti 3D vengono a contatto all'interno del Mondo3D.Per la gestione della collisione personalizzata, BasePart ha un set di eventi di collisione e tecniche di filtraggio della collisione, in modo da poter controllare quali assemblaggi fisici si scontrino con gli altri.
Eventi di collisione
Gli eventi di collisione si verificano quando due > si toccano o smettono di toccarsi nel Mondo3D.Puoi rilevare queste collisioni attraverso gli eventi Touched e TouchEnded che si verificano indipendentemente dal valore della proprietà di ciascuna parte CanCollide.Quando si considera la gestione della collisione sulle parti, nota quanto Seguendo:
- La proprietà di una parte determina se attiva eventi di collisione. Se è impostata su , né né saranno Lanciare.
- La proprietà di una parte CanCollide influisce sul fatto che colliderà fisicamente con altre parti e farà in modo che le forze agiscano su di esse.Anche se CanCollide è disabilitato per una parte, puoi rilevare il tocco e il non tocco attraverso gli eventi Touched e TouchEnded.
- Gli eventi Touched e TouchEnded si attivano solo a seguito di movimento fisico , non da cambiamenti Position o CFrame che causino l'intersezione o l'interruzione dell'intersezione di una parte con un'altra parte.
Toccato
L'evento Touched si attiva quando un BasePart entra in contatto con un altro, o con un Terrain voxel.Si accende solo come risultato di simulazione fisica e non si accenderà quando la parte è Position o CFrame esplicitamente impostata in modo che si intersechi con un'altra parte o voxel.
Il seguente modello di codice mostra come l'evento Touched possa essere collegato a una funzione personalizzata onTouched().Nota che l'evento invia l'argomento otherPart alla funzione, indicando l'altra parte coinvolta nella collisione.
Collisione di parte
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)
Nota che l'evento Touched può essere attivato più volte in rapida successione in base a sottili collisioni fisiche, come quando un oggetto in movimento "si insiede" in una posizione di riposo o quando una collisione coinvolge un modello a più parti.Per evitare di attivare più eventi Touched di quanto necessario, puoi implementare un semplice sistema di debounce che impone un periodo di "ricarica" attraverso un attributo istanza .
Collisione di parte con tempo di recupero
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) -- Imposta l'attributo a vero
task.wait(COOLDOWN_TIME) -- Aspetta la durata del cooldown
part:SetAttribute("Touched", false) -- Ripristina l'attributo
end
end
part.Touched:Connect(onTouched)
Tocco terminato
L'evento si attiva quando l'intero limite di collisione di un esce dai confini di un altro o di un voxel del terreno riempito.Si accende solo come risultato di simulazione fisica e non si accende quando la parte è Position o CFrame esplicitamente impostata in modo che smetta di intersecarsi con un'altra parte o voxel.
Il seguente modello di codice mostra come l'evento TouchEnded possa essere collegato a una funzione personalizzata onTouchEnded().Come Touched , l'evento invia l'argomento otherPart alla funzione, indicando l'altra parte coinvolta.
Rilevamento non-collisione
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)
Filtro di collisione
La collisione filtraggio definisce quali parti fisiche si scontrano con altre.Puoi configurare il filtraggio per numerosi oggetti attraverso gruppi di collisione o puoi controllare le collisioni su una base da parte a parte con istanze.
Gruppi di collisione
La collisione gruppi ti consente di assegnare BaseParts a gruppi dedicati e specificare se o meno si scontrino con quelli di altri gruppi.Le parti all'interno dei gruppi non collidenti passano l'una attraverso l'altra completamente, anche se entrambe le parti hanno il loro set di proprietà CanCollide impostato su true.
Puoi facilmente configurare gruppi di collisione attraverso Studio's Editor dei gruppi di collisione , accessibile facendo clic sul pulsante Gruppi di collisione nella scheda Modello della barra degli strumenti.

L'editor funziona in uno dei seguenti modi: Visualizza in lista che favorisce l'aggancio a sinistra o a destra di Studio, o in una visualizzazione più ampia di tabella che favorisce l'aggancio in alto o in basso.

Registra gruppi
L'editor include un gruppo di collisione predefinito Default che non può essere rinominato o eliminato.Tutti BaseParts appartengono automaticamente a questo gruppo predefinito a meno che non venga assegnato ad un altro Gruppo, il che significa che si scontreranno con tutti gli altri oggetti nel Gruppo Predefinito .
Per creare un nuovo Gruppodi collisione:
Fai clic sul pulsante Aggiungi gruppo nella parte superiore del pannello dell'editor, inserisci un nuovo nome di gruppo e premi Enter .Il nuovo gruppo appare in entrambe le colonne della vista in lista o in entrambe le colonne della vista della tabella.
Ripeti il processo se necessario, scegliendo un nome unico e descrittivo per ogni Gruppo.Nota che puoi cambiare il nome di un Gruppodurante lo sviluppo facendo clic nel suo campo o selezionandolo e facendo clic sul pulsante rinomina .
Configura le collisioni di gruppo
Sotto la configurazione predefinita, gli oggetti in tutti i gruppi si sovrappongono l'un l'altro.Per impedire agli oggetti in un gruppo di collidere con gli oggetti in un altro Gruppo, disattiva la casella nella rispettiva riga/colonna.
Nell'esempio seguente, gli oggetti nel gruppo Cubi non collideranno con gli oggetti nel Gruppo Porte .

Assegnare oggetti ai gruppi
Per assegnare oggetti a gruppi che hai registrato attraverso l'editor Studio:
Seleziona uno o più BaseParts che si qualificano come parte di un Gruppodi collisione.
Assegnali al gruppo facendo clic sul pulsante ⊕ per la sua riga.Gli oggetti possono appartenere a un solo gruppo di collisione alla volta, quindi posizionarli in un nuovo gruppo li rimuove dal loro Gruppoattuale.
Una volta assegnato, il nuovo gruppo viene riflesso sotto la ProprietàCollisionGroup dell'oggetto.

Gruppo di collisione Selezionabile dello studio
Gli strumenti in Studio utilizzano il sistema di filtraggio della collisione per determinare quali oggetti sono candidati alla selezione quando si fa clic nella vista 3D.Gli oggetti il cui gruppo di collisione assegnato non non riesce a collidere con StudioSelectable verranno ignorati.
Ad esempio, se hai checkpoint in un'esperienza di gare la cui area effettiva è definita da grandi parti trasparenti, puoi assegnarli a un gruppo di collisioni checkpoint e quindi renderlo non collidibile con StudioSelectable in modo che non si interponga quando stai modificando la geometria della mappa sottostante.

Per il codice del plugin, si consiglia di assegnare "StudioSelectable" come filtro del gruppo di collisione del tuo RaycastParams quando trovi parti sotto il cursore.Questo consente ai tuoi plugin di corrispondere alla meccanica di selezione che i creatori hanno imparato a aspettarsi dagli strumenti di Studio integrati.
Raggio di selezione del plugin raccomandato
local UserInputService = game:GetService("UserInputService")local Workspace = game:GetService("Workspace")local raycastParams = RaycastParams.new()raycastParams.CollisionGroup = "StudioSelectable" -- Per seguire la convenzioneraycastParams.BruteForceAllSlow = true -- In modo che le parti con CanQuery di "false" possano essere selezionatelocal mouseLocation = UserInputService:GetMouseLocation()local mouseRay = Workspace.CurrentCamera:ViewportPointToRay(mouseLocation.X, mouseLocation.Y)local filteredSelectionHit = Workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 10000, raycastParams)
Filtraggio da parte a parte
Per prevenire le collisioni tra due parti specifiche senza impostare gruppi di collisione, come tra la ruota di un veicolo e il suo telaio, considera la VincoloNessuna collisione.I vantaggi includono:
- I gruppi di collisione e/o gli script di configurazione non sono richiesti, quindi puoi creare e condividere facilmente modelli con filtri di collisione personalizzati.
- Le parti connesse non si scontreranno l'una con l'altra, ma possono ancora scontrarsi con altri oggetti.
Disabilita collisioni di caratteri
I personaggi del giocatore di Roblox si scontrano tra loro per impostazione predefinita.Questo può portare a un Partitainteressante ma non previsto, come i personaggi che saltano sopra gli altri per raggiungere aree specifiche.Se questo comportamento non è desiderabile, puoi prevenirlo attraverso il seguente Script in ServerScriptService .
Script - Disabilita collisioni di caratteri
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)
-- Applica il gruppo di collisione a tutte le parti esistenti nel modello
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)
-- Se il giocatore ha già un personaggio, applica il gruppo di collisione immediatamente
if player.Character then
setCollisionGroup(player.Character)
end
end)
Collisioni modello
Model gli oggetti sono container per parti piuttosto che ereditare da BasePart , quindi non possono connettersi direttamente a BasePart.Touched o BasePart.TouchEnded eventi.Per determinare se un modello attiva eventi di collisione, devi passare attraverso i suoi figli e connettere le funzioni personalizzate onTouched() e onTouchEnded() alle singole figlie BasePart .
Il seguente esempio di codice connette tutti BaseParts di un modello a più parti agli eventi di collisione e traccia il numero totale di collisioni con altre parti.
Collisione modello
local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- Ignora le istanze del modello che si intersecano con se stesso
if otherPart:IsDescendantOf(model) then return end
-- Aumenta il numero di parti del modello che si toccano
numTouchingParts += 1
print(model.Name, "intersected with", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Ignora le istanze del modello che non si intersecano con se stesse
if otherPart:IsDescendantOf(model) then return end
-- Ridurre il numero di parti del modello che si toccano
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
Collisioni mesh e solido modello
MeshPart e PartOperation (parti uniti da modellazione solida ) sono sottoclassi di BasePart , quindi le maglie e le parti modellate solide ereditano le stesse opzioni di collisione e di filtraggio della collisione come le parti regolari.Tuttavia, poiché le maglie e le parti modellate solide di solito hanno geometrie più complesse, hanno una proprietà distintiva CollisionFidelity che determina con quale precisione i confini fisici si allineano con la rappresentazione visiva per la gestione della collisione.
La proprietà CollisionFidelity ha le seguenti opzioni, in ordine di fedeltà e impatto sulle prestazioni dal più basso al più alto:
- Scatola — Crea una Quadro di selezionedi collisione vincolante, ideale per oggetti piccoli o non interattivi.
- Scafo — Genera uno scafo convex, adatto per oggetti con depressioni o cavità meno pronunciate.
- Predefinito — Produce una forma di collisione approssimativa che supporta la concavità, adatta per oggetti complessi con esigenze di interazione semi-finite.
- PreciseConvexDecomposition — Offre la fedeltà più precisa ma ancora non una rappresentazione 1:1 del visivo.Questa opzione ha il costo di performance più elevato e richiede più tempo per il motore per calcolare.

Per maggiori informazioni sull'impatto delle prestazioni delle opzioni di fedeltà della collisione e su come mitigarle, vedi Ottimizzazione delle prestazioni.