Eine Kollision tritt auf, wenn zwei 3D-Objekte im 3D-Raum in Kontakt kommen. Für eine benutzerdefinierte Kollisionserkennung verfügt BasePart über eine Reihe von Kollisionsereignissen und Kollisionsfiltertechniken, damit Sie steuern können, welche physikalischen Bauteile mit anderen kollidieren.
Kollisionsevents
Kollision ereignisse treten auf, wenn zwei BaseParts sich im 3D-Raum berühren oder aufhören, sich zu berühren. Sie können diese Kollisionen über die Touched und TouchEnded Ereignisse erkennen, die unabhängig von den Werten der CanCollide Eigenschaft eines der Teile ausgelöst werden. Beachten Sie Folgendes, wenn Sie die Kollisionserkennung bei Teilen in Betracht ziehen:
- Die CanTouch Eigenschaft eines Teils bestimmt, ob es Kollisionsevents auslöst. Wenn sie auf false gesetzt ist, werden weder Touched noch TouchEnded ausgelöst.
- Die CanCollide Eigenschaft eines Teils beeinflusst, ob es physisch mit anderen Teilen kollidiert und Kräfte auf sie ausübt. Selbst wenn CanCollide für ein Teil deaktiviert ist, können Sie Berührungen und Nicht-Berührungen durch die Touched und TouchEnded Ereignisse erkennen.
- Die Touched und TouchEnded Ereignisse werden nur als Ergebnis von physikalischer Bewegung ausgelöst, nicht durch Änderungen an Position oder CFrame, die dazu führen, dass ein Teil mit einem anderen Teil zur Überlappung oder zum Aufhören der Überlappung führt.
Berührt
Das Touched Ereignis wird ausgelöst, wenn ein BasePart mit einem anderen oder mit einem Terrain Voxel in Kontakt kommt. Es wird nur als Ergebnis der physikalischen Simulation ausgelöst und wird nicht aktiviert, wenn die Position oder CFrame des Teils explizit so gesetzt wird, dass es mit einem anderen Teil oder Voxel überlappt.
Das folgende Code-Muster zeigt, wie das Touched Ereignis mit einer benutzerdefinierten Funktion onTouched() verbunden werden kann. Beachten Sie, dass das Ereignis das Argument otherPart an die Funktion sendet, das auf das andere Teil hinweist, das an der Kollision beteiligt war.
Teil-Kollision
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local function onTouched(otherPart)
print(part.Name .. " kollidierte mit " .. otherPart.Name)
end
part.Touched:Connect(onTouched)
Beachten Sie, dass das Touched Ereignis mehrfach in schneller Folge ausgelöst werden kann, basierend auf subtilen physikalischen Kollisionen, wie wenn ein sich bewegendes Objekt sich "einsenkt" oder wenn eine Kollision ein Mehrteilmodell betrifft. Um zu vermeiden, dass mehr Touched Ereignisse als nötig ausgelöst werden, können Sie ein einfaches Debounce-System implementieren, das einen "Cooldown"-Zeitraum über eine Instanz- Eigenschaft durchsetzt.
Teil-Kollision mit 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 .. " kollidierte mit " .. otherPart.Name)
part:SetAttribute("Touched", true) -- Attribut auf true setzen
task.wait(COOLDOWN_TIME) -- Auf die Cooldown-Dauer warten
part:SetAttribute("Touched", false) -- Attribut zurücksetzen
end
end
part.Touched:Connect(onTouched)
TouchEnded
Das TouchEnded Ereignis wird ausgelöst, wenn der gesamte Kollisionsbereich eines BasePart die Grenzen eines anderen BasePart oder eines gefüllten Terrain Voxel verlässt. Es wird nur als Ergebnis der physikalischen Simulation ausgelöst und wird nicht aktiviert, wenn die Position oder CFrame des Teils explizit so gesetzt wird, dass es aufhört, mit einem anderen Teil oder Voxel zu überlappen.
Das folgende Code-Muster zeigt, wie das TouchEnded Ereignis mit einer benutzerdefinierten Funktion onTouchEnded() verbunden werden kann. Wie bei Touched sendet das Ereignis das Argument otherPart an die Funktion, das das andere betroffene Teil anzeigt.
Nicht-Kollisions-Erkennung
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " berührt nicht mehr " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)
Kollisionsfilterung
Kollisions filterung definiert, welche physischen Teile mit anderen kollidieren. Sie können die Filterung für zahlreiche Objekte über Kollisionsgruppen konfigurieren oder Sie können Kollisionen auf einer Teil-zu-Teil Basis mit NoCollisionConstraint Instanzen steuern.
Kollisionsgruppen
Kollisions gruppen ermöglichen es Ihnen, BaseParts dedizierten Gruppen zuzuweisen und festzulegen, ob sie mit Objekten in anderen Gruppen kollidieren oder nicht. Teile innerhalb von nicht-kollidierenden Gruppen passieren sich vollständig, selbst wenn beide Teile ihre CanCollide Eigenschaft auf true gesetzt haben.
Sie können Kollisionsgruppen einfach über den Kollisionsgruppen-Editor von Studio einrichten, der über das Fenster ⟩ 3D Menü zugänglich ist.
Der Editor funktioniert im Listen View, der das Docking an der linken oder rechten Seite von Studio bevorzugt, oder in einem breiteren Tabellen-View, der das Docking an der Ober- oder Unterseite bevorzugt.

Gruppen registrieren
Der Editor enthält eine Standard-Kollisionsgruppe, die nicht umbenannt oder gelöscht werden kann. Alle BaseParts gehören automatisch zu dieser Standardgruppe, es sei denn, sie werden einer anderen Gruppe zugewiesen, was bedeutet, dass sie mit allen anderen Objekten in der Standard-Gruppe kollidieren werden.
Um eine neue Kollisionsgruppe zu erstellen:
Klicken Sie auf die Schaltfläche Gruppe hinzufügen am oberen Rand des Editor-Panels, geben Sie einen neuen Gruppennamen ein und drücken Sie Enter. Die neue Gruppe erscheint in beiden Spalten der Listenansicht oder in der linken Spalte und der oberen Reihe der Tabellenansicht.

Wiederholen Sie den Vorgang bei Bedarf und wählen Sie für jede Gruppe einen einzigartigen und beschreibenden Namen. Beachten Sie, dass Sie den Namen einer Gruppe während der Entwicklung ändern können, indem Sie in das Feld klicken oder sie auswählen und die Schaltfläche Umbenennen klicken.

Konfigurieren von Gruppenkollisionen
Unter standardmäßiger Konfiguration kollidieren Objekte in allen Gruppen miteinander. Um zu verhindern, dass Objekte in einer Gruppe mit Objekten in einer anderen Gruppe kollidieren, deaktivieren Sie das Kästchen in der jeweiligen Zeile/Spalte.
Im folgenden Beispiel kollidieren Objekte in der Cubes-Gruppe nicht mit Objekten in der Doors-Gruppe.

Objekte Gruppen zuweisen
Um Objekte, die Sie registriert haben, über den Studio-Editor an Gruppen zuzuweisen:
Wählen Sie einen oder mehrere BaseParts, die als Teil einer Kollisionsgruppe qualifizieren.
Weisen Sie sie der Gruppe zu, indem Sie auf die Schaltfläche ⊕ in ihrer Zeile klicken. Objekte können jeweils nur einer Kollisionsgruppe angehören, das Platzieren in einer neuen Gruppe entfernt sie aus ihrer aktuellen Gruppe.

Sobald sie zugewiesen sind, wird die neue Gruppe unter der CollisionGroup-Eigenschaft des Objekts angezeigt.

StudioSelectable-Kollisionsgruppe
Werkzeuge in Studio verwenden das Kollisionsfilterungssystem, um zu bestimmen, welche Objekte Kandidaten für die Auswahl sind, wenn Sie im 3D-Viewport klicken. Objekte, deren zugewiesene Kollisionsgruppe nicht mit StudioSelectable kollidiert, werden ignoriert.
Wenn Sie beispielsweise Punkte in einem Rennspiel haben, deren effektive Bereiche durch große transparente Teile definiert sind, können Sie sie einer Checkpoints-Kollisionsgruppe zuweisen und diese Gruppe dann nicht-kollidierbar mit StudioSelectable machen, damit sie beim Bearbeiten der zugrunde liegenden Kartengeometrie nicht im Weg stehen.

Für Plugin-Code wird empfohlen, "StudioSelectable" als Kollisionsgruppenfilter Ihrer RaycastParams zuzuweisen, wenn Sie Teile unter dem Cursor finden. Dies ermöglicht Ihren Plugins, den Auswahlmechanismen zu entsprechen, die die Ersteller von den integrierten Studio-Tools erwartet haben.
Empfohlener Plugin-Auswahl-Raycastlocal UserInputService = game:GetService("UserInputService")local Workspace = game:GetService("Workspace")local raycastParams = RaycastParams.new()raycastParams.CollisionGroup = "StudioSelectable" -- Um der Konvention zu folgenraycastParams.BruteForceAllSlow = true -- Damit Teile mit CanQuery von "false" ausgewählt werden könnenlocal mouseLocation = UserInputService:GetMouseLocation()local mouseRay = Workspace.CurrentCamera:ViewportPointToRay(mouseLocation.X, mouseLocation.Y)local filteredSelectionHit = Workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 10000, raycastParams)
Teil-zu-Teil-Filterung
Um Kollisionen zwischen zwei spezifischen Teilen zu verhindern, ohne Kollisionsgruppen einzurichten, wie zwischen einem Fahrzeugrad und seiner Karosserie, ziehen Sie den No Collision Constraint in Betracht. Vorteile sind:
- Es sind keine Kollisionsgruppen und/oder Konfigurationsskripte erforderlich, sodass Sie Modelle einfach erstellen und teilen können, die eine benutzerdefinierte Kollisionserkennung aufweisen.
- Verbundene Teile kollidieren nicht miteinander, können jedoch weiterhin mit anderen Objekten kollidieren.
Deaktivieren von Charakterkollisionen
Spielercharaktere in Roblox kollidieren standardmäßig miteinander. Dies kann zu interessanten, aber unbeabsichtigten Gameplay führen, wie z. B. dass Charaktere aufeinander springen, um bestimmte Bereiche zu erreichen. Wenn dieses Verhalten unerwünscht ist, können Sie es durch folgendes Script in ServerScriptService verhindern.
Script - Deaktivieren von Charakterkollisionen
local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
PhysicsService:RegisterCollisionGroup("Characters")
PhysicsService:CollisionGroupSetCollidable("Characters", "Characters", false)
local function onDescendantAdded(descendant)
-- Setzen Sie die Kollisionsgruppe für jedes Teil des Nachkommens
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Characters"
end
end
local function onCharacterAdded(character)
-- Bearbeiten Sie vorhandene und neue Nachkommen für die physikalische Einrichtung
for _, descendant in character:GetDescendants() do
onDescendantAdded(descendant)
end
character.DescendantAdded:Connect(onDescendantAdded)
end
Players.PlayerAdded:Connect(function(player)
-- Erkennen, wann der Charakter des Spielers hinzugefügt wird
player.CharacterAdded:Connect(onCharacterAdded)
end)
Modellkollisionen
Model Objekte sind Container für Teile, anstatt von BasePart zu erben. Daher können sie nicht direkt mit BasePart.Touched oder BasePart.TouchEnded Ereignissen verbunden werden. Um festzustellen, ob ein Modell Kollisionereignisse auslöst, müssen Sie durch seine Kinder schleifen und die benutzerdefinierten onTouched() und onTouchEnded() Funktionen mit jedem Kind BasePart verbinden.
Das folgende Beispiel verbindet alle BaseParts eines Mehrteilmodells mit Kollisionsevents und verfolgt die Gesamtzahl der Kollisionen mit anderen Teilen.
Modellkollision
local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- Ignore instances of the model intersecting with itself
if otherPart:IsDescendantOf(model) then return end
-- Increase count of model parts touching
numTouchingParts += 1
print(model.Name, "überlappt mit", otherPart.Name, "| Modellteile berühren:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Ignore instances of the model un-intersecting with itself
if otherPart:IsDescendantOf(model) then return end
-- Decrease count of model parts touching
numTouchingParts -= 1
print(model.Name, "ist nicht mehr überlappt von", otherPart.Name, "| Modellteile berühren:", numTouchingParts)
end
for _, child in model:GetChildren() do
if child:IsA("BasePart") then
child.Touched:Connect(onTouched)
child.TouchEnded:Connect(onTouchEnded)
end
end
Mesh- und solide Modellkollisionen
MeshPart und PartOperation (Teile, die durch solides Modellieren verbunden sind) sind Unterklassen von BasePart, sodass Meshes und solide modellierte Teile dieselben Kollisionsevents und Kollisionsfilterungs Optionen wie reguläre Teile erben. Da Meshes und solide modellierte Teile jedoch in der Regel komplexere Geometrien haben, verfügen sie über eine spezielle CollisionFidelity Eigenschaft, die bestimmt, wie präzise die physikalischen Grenzen mit der visuellen Darstellung für die Kollisionserkennung übereinstimmen.
Die CollisionFidelity Eigenschaft hat die folgenden Optionen, in Reihenfolge der Genauigkeit und der Auswirkungen auf die Leistung von niedrig bis hoch:
- Box — Erstellt eine begrenzende Kollisionsbox, die ideal für kleine oder nicht-interaktive Objekte ist.
- Hull — Erstellt eine konvexe Hülle, die für Objekte mit weniger ausgeprägten Vertiefungen oder Hohlräumen geeignet ist.
- Standard — Produziert eine ungefähre Kollisionsform, die Konvexität unterstützt und für komplexe Objekte mit halb detaillierten Interaktionsbedürfnissen geeignet ist.
- Präzise Konvexe Zersetzung — Bietet die präziseste Genauigkeit, jedoch immer noch keine 1:1-Darstellung der visuellen Darstellung. Diese Option hat die teuersten Leistungskosten und benötigt länger, um vom Engine berechnet zu werden.

Für weitere Informationen zu den Auswirkungen der Leistung von Optionen zur Kollisionsgenauigkeit und wie man diese mildert, siehe Leistungsoptimierung.