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 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.
  • Die übergeordnete Klasse Terrain 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 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.

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

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.

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

Um eine neue Kollisionsgruppe zu erstellen:

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

    Neue Gruppe im Kollisionsgruppen-Editor in der Listenansicht hinzugefügt
  2. 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.

    Schaltfläche und Feld für das Umbenennen einer Gruppe im Kollisionsgruppen-Editor angezeigt

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.

Gruppe in der Listenansicht des Kollisionsgruppen-Editors konfiguriert

Objekte Gruppen zuweisen

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

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

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

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

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

Gewählte Kollisionsgruppe, die als CollisionGroup-Eigenschaft des Teils angezeigt wird

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.

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

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-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 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.
Ursprüngliches Mesh des Burgenturms

Für weitere Informationen zu den Auswirkungen der Leistung von Optionen zur Kollisionsgenauigkeit und wie man diese mildert, 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.