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 in der 3D-Welt in Kontakt kommen. Für die anpassungsfähige Kollisionsverwaltung hat BasePart eine Reihe von Kollisionsereignissen und Kollisionsfiltern, sodass Sie steuern können, welche physischen Montagen mit anderen kollidieren.

Kollisionsereignisse

Kollisionen treten wenn zwei BaseParts berühren oder aufhören zu berühren in der 3D-Welt. Sie können diese Kollisionen durch die Touched und 1> Class

  • Die Eigenschaft CanTouch einer Teil bestimmt, ob kollisionereignisse ausgelöst werden. Wenn auf false gesetzt, initiierenweder Touched noch 1> Class.BasePart.TouchEnded|TouchEnded1> auf.
  • Die Eigenschaft CanCollide einer Teil beeinflusst, ob er physisch mit anderen Teilen kollidiert und Kräfte auf sie einwirkt. Selbst wenn CanCollide für ein Teil de
  • Die Touched und TouchEnded -Ereignisse nur als Ergebnis von physischen Bewegungen, nicht von einer Class.BasePart.Position|Position oder 2>Class.BasePart.CFrame|CFrame2> -Änderung, die eine Teil interessieren oder stoppen
  • Die oberste Terrain -Klasse erbt von BasePart , so dass Sie eine Zusammenstoßgruppe zu 1> Terrain1> zuweisen können, um zu bestimmen, ob andere 4> Class.BasePart|BaseParts4> mit Terrain-Voxeln kollidieren.

Berührt

Das Ereignis Touched``Class.BasePartClass.BasePart.CFrame|CFrame2>Class.BasePart.Touched|Touched2> 5>

Das folgende Code-Muster zeigt, wie das Ereignis Touched mit einer benutzerdefinierten Funktion onTouched() verbunden werden kann. Beachten Sie, dass das Ereignis das otherPart-Argument an die Funktion sendet, was die andere betroffene Person in der Kollision anzeigt.

Teil-Kollision

local part = workspace.Part
local function onTouched(otherPart)
print(part.Name .. " collided with " .. otherPart.Name)
end
part.Touched:Connect(onTouched)

Beachten Sie, dass das Ereignis Touched mehrere Male in rascher Abfolge basierend auf subtilen physischen Kollisionen, wie z. B. wenn ein bewegliches Objekt in eine ruhige Position "gesetzt" wird oder wenn eine Kollision ein Multi-Part-Modell

Teil-Kollision mit Abklingzeit

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) -- Attribut auf "wahr" setzen
task.wait(COOLDOWN_TIME) -- Warte auf die Abklingzeitdauer
part:SetAttribute("Touched", false) -- Attribut zurücksetzen
end
end
part.Touched:Connect(onTouched)

Berührung beendet

Das Ereignis TouchEnded``Class.BasePart Class.BasePart.T

Das folgende Code-Muster zeigt, wie das Ereignis TouchEnded mit einer benutzerdefinierten Funktion onTouchEnded() verbunden werden kann. Wie Touched, sendet das Ereignis das 1> otherPart1> -Argument an die Funktion, wodurch der andere Teil betroffen ist.

Kollisionen vermeiden

local part = workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " is no longer touching " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)

Kollisionen filtern

Kollision filtert definiert, welche physischen Teile mit anderen kollidieren. Sie können die Filterung für mehrere Objekte über Kollisionsgruppen oder Sie können die Kollisionen auf einer Teil-zu-Teil-Basis mit 1> Class.NoCollisionConstraint1> Instanzen steuern.

Kollisionen Gruppen

Kollision Gruppen lassen Sie Class.BasePart|BaseParts an dedizierte Gruppen zuweisen und spezifizieren, ob sie mit denen in anderen Gruppen kollidieren oder nicht. Teile innerhalb nicht kollidierender Gruppen durchlaufen einander vollständig, auch wenn beide Teile ihre Class.BasePart.CanCollide|CanCollide -Eigenschaft setzen auf true .

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

Du kannst einfach Kollisionsgruppen durch Studio's Kollisionsgruppen-Editor einrichten, indem du auf die Schaltfläche Kollisionsgruppen-Button in der Modell-Registerkarte klickst.

Collision Groups tool indicated in Model tab of Studio

Der Editor funktioniert entweder in List View, der das Docken auf der linken oder rechten Seite von Studio bevorzugt, oder in einer breiteren Tabelle View, die das Docken an die Spitze oder am unteren Rand von Studio bevorzugt.

List View example in Collision Groups Editor

Gruppen registrieren

Der Editor enthält eine Standard- Zusammenstoßgruppe, die nicht umbenannt oder gelöscht werden kann. Alle BaseParts gehören automatisch zu dieser Standardgruppe, wenn sie nicht einer anderen Gruppe zugewiesen sind, was bedeutet, dass sie mit allen anderen Objekten in der Standard- Gruppe kollidieren.

Um eine neue Gruppezu erstellen:

  1. Klicken Sie auf die Schaltfläche Gruppen-Erlangtaste in der oberen rechten Ecke des Editor-Panels und geben Sie einen neuen Gruppennamen ein, und drücken Sie Enter . Die neue Gruppe erscheint in beiden Spalten der Ansichtoder in beiden linken Spalten und oberen Reihen der Ansicht.

    New group added to Collision Groups Editor in List View
  2. Wiederholen Sie den Prozess, wenn nötig, indem Sie einen einzigartigen und beschreibenden Namen für jede Gruppe auswählen. Beachten Sie, dass Sie den Namen einer Gruppe während der Entwicklung ändern können, indem Sie in sein Feld klicken oder auswählen und auf die Schaltfläche neuen Namen klicken.

    Button and field indicated for renaming a group in the Collision Groups Editor

Gruppenkollisionen konfigurieren

Unter der Standardkonfiguration kollidieren Objekte in allen Gruppen miteinander. Um Objekte in einer Gruppe mit Objekten in einer anderen Gruppe zu verhindern, deaktivieren Sie unmarkieren die Box in der jeweiligen Zeile/Säule.

Im folgenden Beispiel, Objekte in der Kuben-Gruppe werden nicht mit Objekten in der Tür-Gruppe kollidieren.

Group configured in List View of Collision Groups Editor

Objekte Gruppen zuweisen

Um Objekten zu Gruppen zuzuordnen, die du über den Studio-Editor registriert hast:

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

  2. Weisen Sie ihnen der Gruppe zu, indem Sie auf die Schaltfläche für ihre Reihe klicken. Objekte können nur einer Zusammenstoßgruppe zugewiesen sein, so dass das Platzieren in einer neuen Gruppe sie aus ihrer aktuellen Gruppe entfernt.

    Plus button indicated in Collision Groups Editor for adding selected parts to a group

Nachdem eine neue Gruppe zugewiesen ist, wird die neue Gruppe unter der Eigenschaft CollisionGroup des Objekts reflektiert.

Chosen collision group indicated as the part's CollisionGroup property

StudioSelectable Kollision Gruppe

Die Werkzeuge in Studio verwenden das Kollisionsfiltrierungssystem, um festzustellen, welche Objekte als Kandidaten für die Auswahl ausgewählt werden, wenn Sie in der Ansichtsfensterklicken. Objekte, deren zugewiesene Kollisionsgruppe nicht mit StudioSelectable kollidiert, werden ignoriert.

Zum Beispiel, wenn Sie Checkpoints in einem Renn-Erlebnis haben, deren effektive Bereiche durch große transparente Teile definiert sind, können Sie sie einer Checkpoints-Kollisionsgruppe zuweisen und dann machen, dass diese Gruppe nicht kollidiert mit StudioSelectable, so dass sie nicht im Wege sind, wenn Sie die zugrunde liegende Map-Geometrie bearbeiten.

Checkpoints group configured to be non-collidable with StudioSelectable group

Für Codeswird empfohlen, "StudioSelectable" als Kollisionsgruppenfilter deines RaycastParams zu verwenden, wenn du Teile unter dem Cursor findest. Dies ermöglicht es deinen Plugins, die Auswahlmechaniken zu matchen, die Ersteller von integrierten Studio-Tools erwarten.

Empfohlene Plugin-Auswahl Raycast

local UserInputService = game:GetService("UserInputService")
local raycastParams = RaycastParams.new()
raycastParams.CollisionGroup = "StudioSelectable" -- Um die Konvention zu folgen
raycastParams.BruteForceAllSlow = true -- Damit können Teile mit CanQuery von "false" ausgewählt werden
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 zu verhindern, dass sich zwei spezifische Teile ohne die Einrichtung von Kollisionsgruppen kollidieren, z. B. zwischen dem Rad eines Fahrzeugs und seinem Chassis, berücksichtigen Sie die Beschränkung. Vorteile sind:

  • Kollisionsgruppen und/oder Konfigurationsskripte werden nicht benötigt, so dass Sie einfach Modelle mit anpassbarem Kollisionsfilter erstellen und teilen können.
  • Verbundene Teile stoßen nicht untereinander, aber sie können immer noch mit anderen Objekten kollidieren.

Charakter-Kollisionen deaktivieren

Roblox-Spieler-Charaktere kollidieren standardmäßig mit einander. Dies kann zu interessanten, aber nicht beabsichtigten Gameplayführen, wie z. B. Charaktere, die aufeinander springen, um bestimmte Bereiche zu erreichen. Wenn dieses Verhalten nicht gewünscht ist, können Sie es über die folgenden Script in ServerScriptService deaktivieren.

Script - Zeichenkollisionen deaktivieren

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 nachkommende Nachfolger
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Characters"
end
end
local function onCharacterAdded(character)
-- Verarbeite bestehende und neue Nachkommen für die Physik-Einstellungen
for _, descendant in character:GetDescendants() do
onDescendantAdded(descendant)
end
character.DescendantAdded:Connect(onDescendantAdded)
end
Players.PlayerAdded:Connect(function(player)
-- Erkennen, wenn der Charakter des Spieler:inhinzugefügt wird
player.CharacterAdded:Connect(onCharacterAdded)
end)

Modell-Kollisionen

Model Objekte sind Container für Teile, nicht hervorgegangen von BasePart, sodass sie nicht direkt auf BasePart.Touched oder 0> Class.BasePart

Das folgende Codebeispiel verbindet alle BaseParts eines Multi-Part-Modells mit Kollisionsereignissen und verfolgt die Gesamtzahl der Kollisionen mit anderen Teilen.

Modell-Kollision

local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- Ignoriere Instanzen des Modells, die mit sich selbst interagieren
if otherPart:IsDescendantOf(model) then return end
-- Erhöhen Sie die Anzahl der berührten Modellteile
numTouchingParts += 1
print(model.Name, "intersected with", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Ignoriere Instanzen des Modells, die mit sich selbst nicht kollidieren
if otherPart:IsDescendantOf(model) then return end
-- Reduzieren Sie die Anzahl der berührten Modellteile
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

Mesh und Solid Modell Zusammenstöße

MeshPart and PartOperation (durch starke Modellierung verbundene Teile erben dieselben 0>Kollisionsereignisse

Die CollisionFidelity Eigenschaft hat die folgenden Optionen, in der Reihenfolge der Fidelität und des Leistungseffekts von niedrig nach hoch:

  • Box — Erstellt eine Auswahlbox, ideal für kleine oder nicht interaktive Objekte.
  • Rumpf — Generiert einen konvekten Rumpf, der für Objekte mit weniger ausgeprägten Kerbverzahnungen oder Kerbkörpern geeignet ist.
  • Standard — Produziert eine ungefähre Kollisionsform, die für komplexe Objekte mit halb detaillierten Interaktionsbedürfnissen geeignet ist.
  • PreciseConvexDecomposition — Bietet die präziseste Genauigkeit, aber ist immer noch keine 1:1-Repräsentation des Visuellen. Diese Option hat den höchsten Leistungskosten und dauert länger für die Engine, um zu berechnen.
Original mesh of castle tower

For more information on the performance impact of collision fidelity options and how to mitigate them, see Performance Optimization . For an in-depth walkthrough on how to choose a collision fidelity option that balances your precision needs and performance requirements, see hier .