Kollisionen

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

Eine Kollision tritt auf, wenn zwei 3D-Objekte im 3D-Raum in Kontakt kommen. Für eine benutzerdefinierte Kollisionserkennung bietet BasePart eine Reihe von Kollisionsereignissen und Kollisionsfiltertechniken, sodass Sie steuern können, welche physikalischen Baugruppen mit anderen kollidieren.

Kollisionsevents

Kollision ereignisse treten auf, wenn zwei BaseParts im 3D-Raum berührt werden oder den Kontakt einstellen. Sie können diese Kollisionen über die Touched und TouchEnded Ereignisse erkennen, die unabhängig vom Wert der CanCollide Eigenschaft eines Teils auftreten. Bei der Berücksichtigung der Kollisionserkennung bei Teilen beachten Sie Folgendes:

  • 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 über die Touched und TouchEnded Ereignisse erkennen.
  • Die Touched und TouchEnded Ereignisse werden nur als Ergebnis von physikalischer Bewegung ausgelöst, nicht durch Änderungen der Position oder CFrame, die dazu führen, dass ein Teil mit einem anderen Teil in Kontakt tritt oder den Kontakt einstellt.
  • Die oberste Terrain Klasse erbt von BasePart, sodass Sie eine Kollisionsgruppe zu Terrain zuweisen können, um zu bestimmen, ob andere BaseParts mit Terrain Voxeln kollidieren.

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 von physikalischer Simulation ausgelöst und wird nicht ausgelöst, wenn die Position oder CFrame des Teils explizit so gesetzt wird, dass es mit einem anderen Teil oder Voxel in Kontakt tritt.

Das folgende Code-Muster zeigt, wie das Touched Ereignis mit einer benutzerdefinierten onTouched() Funktion verbunden werden kann. Beachten Sie, dass das Ereignis das Argument otherPart an die Funktion sendet, das das andere Teil angibt, das an der Kollision beteiligt ist.

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 in eine Ruheposition "sinkt" oder wenn eine Kollision ein Mehrteil-Modell betrifft. Um zu vermeiden, dass mehr Touched Ereignisse als nötig ausgelöst werden, können Sie ein einfaches Debounce-System implementieren, das eine "Abkühlzeit" über eine Instanz Attribut durchsetzt.

Teil Kollision Mit Abkühlzeit
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 Abkühlzeit warten
part:SetAttribute("Touched", false) -- Attribut zurücksetzen
end
end
part.Touched:Connect(onTouched)

TouchEnded

Das TouchEnded Ereignis wird ausgelöst, wenn die gesamten Kollisionsgrenzen eines BasePart die Grenzen eines anderen BasePart oder eines gefüllten Terrain Voxels verlassen. Es wird nur als Ergebnis von physikalischer Simulation ausgelöst und wird nicht ausgelöst, wenn die Position oder CFrame des Teils explizit so gesetzt wird, dass es aufhört, mit einem anderen Teil oder Voxel in Kontakt zu treten.

Das folgende Code-Muster zeigt, wie das TouchEnded Ereignis mit einer benutzerdefinierten onTouchEnded() Funktion verbunden werden kann. Wie bei Touched sendet das Ereignis das Argument otherPart an die Funktion, das das andere Teil angibt, das beteiligt ist.

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 bestimmten Gruppen zuzuweisen und anzugeben, ob sie mit denen in anderen Gruppen kollidieren oder nicht. Teile innerhalb nicht-kollidierender Gruppen durchdringen sich vollständig, selbst wenn beide Teile ihre CanCollide Eigenschaft auf true gesetzt haben.

Im obigen Video befinden sich die sich drehenden Objekte in verschiedenen Kollisionsgruppen, sodass sie mit Objekten einer anderen Farbe kollidieren, aber nicht mit Objekten ihrer eigenen Farbe

Sie können Kollisionsgruppen einfach über den Kollisionsgruppen-Editor von Studio einrichten, der über das Fenster ⟩ 3D-Menü zugänglich ist.

Der Editor funktioniert entweder im Listenansicht, die das Docking an der linken oder rechten Seite von Studio begünstigt, oder in einer breiteren Tabellenansicht, die das Docking an der oberen oder unteren Seite begünstigt.

Beispiel für Listenansicht im Kollisionsgruppen-Editor

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.

Um eine neue Kollisionsgruppe zu erstellen:

  1. Klicken Sie auf die Schaltfläche Gruppe hinzufügen oben im Editor-Panel, geben Sie einen neuen Gruppennamen ein und drücken Sie Enter. Die neue Gruppe erscheint in beiden Spalten der Listenansicht oder in beiden der linken Spalte und der oberen Reihe der Tabellenansicht.

    Neue Gruppe im Kollisionsgruppen-Editor in der Listenansicht hinzugefügt
  2. Wiederholen Sie den Vorgang bei Bedarf und wählen Sie einen einzigartigen und beschreibenden Namen für jede Gruppe. Beachten Sie, dass Sie den Namen einer Gruppe während der Entwicklung ändern können, indem Sie in das Feld klicken oder indem Sie sie auswählen und auf die Schaltfläche umbenennen klicken.

    Schaltfläche und Feld zum Umbenennen einer Gruppe im Kollisionsgruppen-Editor angezeigt

Gruppen-Kollisionen konfigurieren

Unter der Standardkonfiguration kollidieren Objekte in allen Gruppen miteinander. Um zu verhindern, dass Objekte in einer Gruppe mit Objekten in einer anderen Gruppe kollidieren, deaktivieren Sie das Kontrollkästchen in der jeweiligen Zeile/Spalte.

Im folgenden Beispiel werden Objekte in der Cubes-Gruppe nicht mit Objekten in der Doors-Gruppe kollidieren.

Gruppe in der Listenansicht des Kollisionsgruppen-Editors konfiguriert

Objekte Gruppen zuweisen

Um Objekte, die Sie registriert haben, über den Studio-Editor Gruppen zuzuweisen:

  1. Wählen Sie ein oder mehrere BaseParts aus, die als Teil einer Kollisionsgruppe qualifizieren.

  2. Weisen Sie sie der Gruppe zu, indem Sie auf die Schaltfläche für deren Zeile klicken. Objekte können nur einer Kollisionsgruppe gleichzeitig angehören, sodass das Platzieren in einer neuen Gruppe sie aus ihrer aktuellen Gruppe entfernt.

    Plus-Schaltfläche im Kollisionsgruppen-Editor angezeigt, um ausgewählte Teile einer Gruppe hinzuzufügen

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

Ausgewählte Kollisionsgruppe als die CollisionGroup-Eigenschaft des Teils angezeigt

StudioSelectable-Kollisionsgruppe

Werkzeuge in Studio verwenden das Kollisionsfilterungssystem, um zu bestimmen, welche Objekte Kandidaten für die Auswahl sind, wenn im 3D-Viewport geklickt wird. Objekte, deren zugewiesene Kollisionsgruppe nicht mit StudioSelectable kollidiert, werden ignoriert.

Wenn Sie beispielsweise Checkpoints in einem Rennspiel haben, deren effektive Bereiche durch große transparente Teile definiert sind, können Sie sie einer Checkpoints-Kollisionsgruppe zuweisen und dann diese Gruppe nicht-kollidierbar mit StudioSelectable machen, damit sie beim Bearbeiten der zugrunde liegenden Kartengeometrie nicht im Weg stehen.

Checkpoints-Gruppe konfiguriert, um nicht mit der StudioSelectable-Gruppe kollidierbar zu sein

Für Plugin-Code wird empfohlen, dass Sie "StudioSelectable" als den Kollisionsgruppenfilter Ihrer RaycastParams zuweisen, wenn Sie Teile unter dem Cursor finden. Dies ermöglicht es Ihren Plugins, die Auswahlmechanik zu entsprechen, die die Ersteller von den integrierten Studio-Tools erwarten.

Empfohlene Plugin-Auswahl Raycast
local UserInputService = game:GetService("UserInputService")
local Workspace = game:GetService("Workspace")
local raycastParams = RaycastParams.new()
raycastParams.CollisionGroup = "StudioSelectable" -- Um der Konvention zu folgen
raycastParams.BruteForceAllSlow = true -- Damit Teile mit CanQuery von "false" ausgewählt werden können
local 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 bestimmten Teilen zu verhindern, ohne Kollisionsgruppen einzurichten, wie zwischen dem Rad eines Fahrzeugs und seinem Chassis, sollten Sie den No Collision Constraint in Betracht ziehen. Vorteile sind:

  • Kollisionsgruppen und/oder Konfigurationsskripte sind nicht erforderlich, sodass Sie Modelle mit benutzerdefinierter Kollisionsfilterung einfach erstellen und teilen können.
  • Verbundene Teile kollidieren nicht miteinander, können jedoch weiterhin mit anderen Objekten kollidieren.

Deaktivieren von Charakterkollisionen

Roblox-Spielercharaktere kollidieren standardmäßig miteinander. Dies kann zu interessanten, aber unbeabsichtigten Spielmechaniken 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 das folgende Script im ServerScriptService verhindern.

Skript - 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-Nachkommen
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Characters"
end
end
local function onCharacterAdded(character)
-- Verarbeiten Sie vorhandene und neue Nachkommen für die Physikeinrichtung
for _, descendant in character:GetDescendants() do
onDescendantAdded(descendant)
end
character.DescendantAdded:Connect(onDescendantAdded)
end
Players.PlayerAdded:Connect(function(player)
-- Erkennen, wenn der Charakter des Spielers hinzugefügt wird
player.CharacterAdded:Connect(onCharacterAdded)
end)

Modellkollisionen

Model Objekte sind Container für Teile und erben nicht von BasePart, sodass sie nicht direkt mit BasePart.Touched oder BasePart.TouchEnded Ereignissen verbunden werden können. Um zu bestimmen, ob ein Modell Kollisionsevents auslöst, müssen Sie durch seine Kinder iterieren und die benutzerdefinierten onTouched() und onTouchEnded() Funktionen mit jedem Kind BasePart verbinden.

Das folgende Codebeispiel 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)
-- Ignoriere Instanzen des Modells, die sich selbst überschneiden
if otherPart:IsDescendantOf(model) then return end
-- Erhöhe die Anzahl der berührenden Modellteile
numTouchingParts += 1
print(model.Name, "überschneidet sich mit", otherPart.Name, "| Modellteile berühren:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Ignoriere Instanzen des Modells, die sich nicht mehr überschneiden
if otherPart:IsDescendantOf(model) then return end
-- Verringere die Anzahl der berührenden Modellteile
numTouchingParts -= 1
print(model.Name, "überschneidet sich nicht mehr mit", 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 die gleichen Kollisionsevents und Kollisionsfilterungs Optionen wie reguläre Teile erben. Da Meshes und solide modellierte Teile jedoch normalerweise komplexere Geometrien aufweisen, haben sie eine besondere CollisionFidelity Eigenschaft, die bestimmt, wie genau die physikalischen Grenzen mit der visuellen Darstellung für die Kollisionserkennung übereinstimmen.

Die CollisionFidelity Eigenschaft hat die folgenden Optionen, in der Reihenfolge der Genauigkeit und der Auswirkungen auf die Leistung von niedrig bis hoch:

  • Box — Erstellt eine begrenzende Kollisionsbox, ideal für kleine oder nicht-interaktive Objekte.
  • Hull — Generiert eine konvexe Hülle, geeignet für Objekte mit weniger ausgeprägten Vertiefungen oder Hohlräumen.
  • Standard — Produziert eine ungefähre Kollisionsform, die Konkavität unterstützt, geeignet für komplexe Objekte mit semi-detaillierten Interaktionsbedürfnissen.
  • PreciseConvexDecomposition — Bietet die genaueste Genauigkeit, ist jedoch immer noch keine 1:1-Darstellung des Visuellen. Diese Option hat die teuersten Leistungskosten und benötigt länger, um vom Engine berechnet zu werden.
Ursprüngliches Mesh des Schloss-Turms

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

©2026 Roblox Corporation. Roblox, das Roblox-Logo und "Powering Imagination" gehören zu unseren eingetragenen und nicht eingetragenen Markenzeichen in den USA und anderen Ländern.