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 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 .
Du kannst einfach Kollisionsgruppen durch Studio's Kollisionsgruppen-Editor einrichten, indem du auf die Schaltfläche Kollisionsgruppen-Button in der Modell-Registerkarte klickst.
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.
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:
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.
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.
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.
Objekte Gruppen zuweisen
Um Objekten zu Gruppen zuzuordnen, die du über den Studio-Editor registriert hast:
Wählen Sie einen oder mehrere BaseParts, die als Teil einer Gruppequalifizieren.
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.
Nachdem eine neue Gruppe zugewiesen ist, wird die neue Gruppe unter der Eigenschaft CollisionGroup des Objekts reflektiert.
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.
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 folgenraycastParams.BruteForceAllSlow = true -- Damit können Teile mit CanQuery von "false" ausgewählt werdenlocal 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.
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 .