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 beenden. 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 an Position oder CFrame, die dazu führen, dass ein Teil mit einem anderen Teil in Kontakt tritt oder den Kontakt beendet.
  • Die oberste Terrain Klasse erbt von BasePart, sodass Sie eine Kollisionsgruppe für 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 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 physischen Kollisionen, wie wenn ein sich bewegendes Objekt in eine Ruheposition "sinkt" 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 eine "Cooldown"-Periode über ein Instanz-Attribut durchsetzt.

Teil Kollision mit Cooldown
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 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 part = workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " berührt nicht mehr " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)

Kollision Zusammenfassungen

Touched sagt Ihnen dass eine Kollision stattgefunden hat, aber nicht wo sie stattgefunden hat, aus welcher Richtung sie kam oder wie stark sie war. Für detaillierte Kontaktdaten von der Physik-Engine rufen Sie BindToCollisionSummaries() auf einem Teil auf. Es nimmt einen Callback entgegen und gibt eine RBXScriptConnection zurück, die Sie trennen können, wenn Sie die Daten nicht mehr benötigen. Dies ist eine separate API von Touched, also rufen Sie es nicht innerhalb eines Touched Handlers auf.

Der Callback wird einmal pro Frame ausgeführt, nachdem der physikalische Schritt abgeschlossen ist. Er erhält eine Tabelle mit einer Zusammenfassung jeder Kollision, an der das Teil in diesem Frame beteiligt war. Jede Zusammenfassung beschreibt einen Kontaktbereich zwischen dem abonnierten Teil und einem anderen Teil. Zusammenfassungen sind eingefroren und können nicht geändert werden. Jede hat diese Felder:

FeldTypBeschreibung
TimenumberSimulationszeit des Subschritts.
Part0BasePartDas abonnierte Teil.
Part1BasePartDas andere Teil im Paar.
PointVector3Durchschnittlicher Kontaktpunkt im Weltkoordinatensystem.
NormalVector3Einheitsnormalenvektor. Er zeigt immer von Part0 weg.
RelativeVelocityVector3Geschwindigkeit von Part1 relativ zu Part0 am Kontaktpunkt, gemessen bevor der Solver die Kollision löst.
AreanumberGeschätzte Fläche des Kontaktbereichs.

Um die Aufprallgeschwindigkeit zu ermitteln, nehmen Sie das Skalarprodukt von RelativeVelocity und Normal. Um schräg auftreffende Kollisionen oder Gleiten zu erkennen, verwenden Sie die tangentiale Komponente von RelativeVelocity. Wenn Sie einen Wert näher an einer Kraft wünschen, kombinieren Sie die Geschwindigkeit mit der AssemblyMass der Teile.

Aufprallbasierte Effekte
local part = workspace.Part
local function onCollision(summaries)
for _, summary in summaries do
local impactSpeed = summary.RelativeVelocity:Dot(summary.Normal)
if impactSpeed > 10 then
print("Harter Aufprall bei", summary.Point, "mit Geschwindigkeit", impactSpeed)
end
end
end
local connection = part:BindToCollisionSummaries(onCollision)
-- Später, wenn Sie die Zusammenfassungen nicht mehr benötigen
connection:Disconnect()

Beachten Sie Folgendes, wenn Sie Kollision Zusammenfassungen verwenden:

  • Zusammenfassungen werden nur auf dem Netzwerkbesitzer generiert, der die physikalische Simulation ausführt, was ein Client oder der Server sein kann. Sie werden nicht repliziert. Wenn andere Clients über eine Kollision informiert werden müssen, verarbeiten Sie die Zusammenfassung und senden Sie nur die Daten, die sie benötigen, über Ihr eigenes Remote-Event.
  • Teile mit CanCollide, die auf false gesetzt sind, erzeugen keine Kollision Zusammenfassungen.
  • Komplexe nicht-konvexe Teile können mehr als eine Zusammenfassung für dasselbe Paar von Teilen erzeugen.
  • Kontakte zwischen zwei schlafenden Teilen werden nicht aufgezeichnet.
  • Die Verarbeitungskosten steigen mit der Anzahl der abonnierten Teile, nicht mit der Gesamtzahl der Kollisionen im Ort.

Kollision Filtern

Kollision filtern definiert, welche physischen Teile mit anderen kollidieren. Sie können das Filtern für zahlreiche Objekte über Kollisionsgruppen konfigurieren oder Sie können Kollisionen auf einer Teil-zu-Teil Basis mit NoCollisionConstraint Instanzen steuern.

Kollision Gruppen

Kollision 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. Kollision Gruppen werden auf Basis von Workspace oder WorldModel erstellt und konfiguriert.

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

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

Gruppen registrieren

Workspace speichert seinen eigenen konfigurierbaren Zustand von Kollision Gruppen. Darüber hinaus kann jedes WorldModel entscheiden, seine eigenen Kollision Gruppen für Abfragen zu verwenden.

Der Editor enthält eine Standard Kollision Gruppe, 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 Kollision Gruppe zu erstellen:

  1. Standardmäßig werden Gruppen in Workspace registriert, aber wenn Sie mindestens ein WorldModel in Ihrem Ort haben, wird ein Auswahl-Dropdown oben im Kollision Gruppen Editor angezeigt. Verwenden Sie das Dropdown, um Kollision Gruppen über verschiedene WorldModel Instanzen zu konfigurieren.

    Workspace als aktuell aktives Welt im Kollision Gruppen Editor angezeigt

    Für jedes WorldModel können Sie Workspace-Kollisionsgruppen verwenden aktivieren, um es zu ermöglichen, dass es Workspace Kollision Gruppen für seine Abfragen verwendet.

    Checkbox angezeigt, um die Verwendung der Workspace-Kollisionsgruppen für ein WorldModel umzuschalten
  2. Klicken Sie auf die Schaltfläche Gruppe hinzufügen oben im Editor-Fenster, 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 Kollision Gruppen Editor in der Listenansicht hinzugefügt
  3. 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 die Schaltfläche umbenennen klicken.

    Schaltfläche und Feld angezeigt, um eine Gruppe im Kollision Gruppen Editor umzubenennen

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 entsprechenden Zeile/Spalte.

Im folgenden Beispiel werden Objekte in der Würfel Gruppe nicht mit Objekten in der Türen Gruppe kollidieren.

Gruppe in der Listenansicht des Kollision Gruppen 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 Kollision Gruppe qualifizieren.

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

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

    Nach der Zuweisung wird die neue Gruppe unter der CollisionGroup Eigenschaft des Objekts angezeigt.

    Ausgewählte Kollision Gruppe als CollisionGroup-Eigenschaft des Teils angezeigt

StudioSelectable Gruppe

Werkzeuge in Studio verwenden das Kollision Filter-System, um zu bestimmen, welche Objekte Kandidaten für die Auswahl sind, wenn im 3D-Viewport geklickt wird. Objekte, deren zugewiesene Kollision Gruppe 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 Kollision Gruppe 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-kollidierbar mit der StudioSelectable Gruppe zu sein

Für Plugin-Code wird empfohlen, dass Sie "StudioSelectable" als Kollision Gruppenfilter 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.

Empfohlener Plugin-Auswahl Raycast
local UserInputService = game:GetService("UserInputService")
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 Filtern

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:

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

Charakterkollisionen deaktivieren

Roblox-Spielercharaktere kollidieren standardmäßig miteinander. Dies kann zu interessanten, aber unbeabsichtigten Spielabläufen führen, wie z. B. Charaktere, die 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 - Charakterkollisionen deaktivieren
local Players = game:GetService("Players")
workspace:RegisterCollisionGroup("Charaktere")
workspace:CollisionGroupSetCollidable("Charaktere", "Charaktere", false)
local function onDescendantAdded(descendant)
-- Kollision Gruppe für jedes Teil-Nachkommen festlegen
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Charaktere"
end
end
local function onCharacterAdded(character)
-- Vorhandene und neue Nachkommen für die Physik-Konfiguration verarbeiten
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)
-- Instanzen des Modells, die sich selbst überschneiden, ignorieren
if otherPart:IsDescendantOf(model) then return end
-- Zähle 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)
-- Instanzen des Modells, die sich selbst nicht mehr überschneiden, ignorieren
if otherPart:IsDescendantOf(model) then return end
-- Zähle 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 Kollisionsfilter 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.
  • PräziseKonvexeZerlegung — 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 von der 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 Sie diese mindern können, 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.