3D Ziehdetektoren

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

Die DragDetector-Instanz erleichtert und fördert die Interaktion mit 3D-Objekten in einem Spiel, wie das Öffnen von Türen und Schubladen, das Verschieben eines Teils, das Greifen und Werfen eines Bowlingballs, das Zurückziehen und Abfeuern einer Schleuder und vieles mehr. Zu den Hauptmerkmalen gehören:

  • Platzieren Sie einen DragDetector unter jedem BasePart oder Model, um es über alle Eingaben (Maus, Berührung, Gamepad und VR) ziehbar zu machen, und das ganz ohne eine einzige Zeile Code.

  • Wählen Sie aus mehreren Ziehstilen, definieren Sie, wie das Objekt auf Bewegung reagiert, und wenden Sie optional Achsen- oder Bewegungsgrenzen an.

  • Skripte können auf die Manipulation gezogener Objekte reagieren, um die Benutzeroberfläche zu steuern oder logische Entscheidungen zu treffen, wie z.B. die Anpassung des Lichtniveaus in einem Raum basierend auf einem dimmbaren Wandschalter.

  • Spieler können verankerte Teile oder Modelle manipulieren, und sie bleiben genau dort, wo Sie sie nach dem Loslassen platziert haben.

  • DragDetectors funktionieren im Studio, solange Sie nicht die Werkzeuge Auswählen, Bewegen, Skalieren oder Drehen verwenden, was es einfacher macht, ziehbare Objekte während der Bearbeitung zu testen und anzupassen.

Objekte ziehbar machen

Um ein beliebiges Teil oder Modell ziehbar zu machen, fügen Sie einfach einen DragDetector als direkten Nachkommen hinzu.

  1. Im Explorer-Fenster fahren Sie mit der Maus über das Part, MeshPart oder Model und klicken auf die ⊕-Schaltfläche. Ein kontextbezogenes Menü wird angezeigt.

  2. Fügen Sie aus dem Menü einen DragDetector ein.

  3. Standardmäßig wird das Objekt jetzt im Bodenbereich ziehbar sein, aber Sie können seinen DragStyle anpassen, definieren, wie es auf Bewegung reagiert, und optional Achsen- oder Bewegungsgrenzen anwenden.

Ziehdetektoren anpassen

Ziehstil

DragDetectors ordnen die Cursorbewegung virtuellen Linien und Ebenen zu, um die vorgeschlagene 3D-Bewegung zu berechnen. Über die DragStyle-Eigenschaft können Sie aus verschiedenen Zuordnungen wählen, die Ihren Bedürfnissen entsprechen. Zum Beispiel erzeugt TranslatePlane eine Translation in einer virtuellen Ebene, während RotateAxis eine Rotation um eine virtuelle Achse erzeugt.

EinstellungBeschreibung
TranslateLine1D-Bewegung entlang der Achse des Detektors, standardmäßig der Welt-Y-Achse.
TranslatePlane2D-Bewegung in der Ebene senkrecht zur Achse des Detektors, standardmäßig der Welt-XZ-Ebene.
TranslatePlaneOrLine2D-Bewegung in der Ebene senkrecht zur Achse des Detektors und, wenn der Modifier aktiv ist, 1D-Bewegung entlang der Achse des Detektors.
TranslateLineOrPlane1D-Bewegung entlang der Achse des Detektors und, wenn der Modifier aktiv ist, 2D-Bewegung in der Ebene senkrecht zur Achse des Detektors.
TranslateViewPlane2D-Bewegung in der Ebene senkrecht zur Sicht des Kameras. In diesem Modus wird die Ebene ständig aktualisiert, selbst während des Ziehens, und wird immer der aktuellen Sicht der Kamera zugewandt.
RotateAxisRotation um die Achse des Detektors, standardmäßig der Welt-Y-Achse.
RotateTrackballTrackball-Rotation, die weiter über die Eigenschaften TrackballRadialPullFactor und TrackballRollFactor angepasst werden kann.
BestForDeviceTranslatePlaneOrLine für Maus und Gamepad; TranslatePlane für Berührung; 6DOF für VR.
ScriptableBerechnet die gewünschte Bewegung über eine benutzerdefinierte Funktion, die über SetDragStyleFunction() bereitgestellt wird.

Ziehrichtung

Standardmäßig werden 3D-Bewegung und der zugehörige DragStyle auf den Weltbereich abgebildet. Sie möchten möglicherweise die ReferenceInstance, Orientation oder Axis ändern, beispielsweise beim Erstellen von Ziehdetektoren in Modellen mit verstellbaren Teilen.

EigenschaftBeschreibungStandard
ReferenceInstanceEine Instanz, deren Pivot den Referenzrahmen für den Ziehdetektor bereitstellt. Der DragFrame wird relativ zu diesem Referenzrahmen ausgedrückt, der über GetReferenceFrame() abgerufen werden kann. Wenn der Referenzrahmen nil ist, erfolgt die Translation in Richtung (oder in der Ebene senkrecht zur) der Axis-Eigenschaft im Weltbereich.nil
OrientationGibt die YXZ-Rotation der Bewegungsachsen relativ zum Referenzrahmen an (ändert nicht die Orientierung des Referenzrahmens selbst). Lineare Translation und axiale Rotation erfolgen auf dieser neu orientierten Y-Achse, und die planare Translation in der XZ-Ebene. Das Ändern dieses Wertes aktualisiert automatisch Axis und umgekehrt.(0, 0, 0)
AxisDie primäre Bewegungsachse, ausgedrückt relativ zum Referenzrahmen. Das Ändern dieses Wertes aktualisiert automatisch Orientation und umgekehrt.(0, 1, 0)

Reaktion auf Bewegung

Die ResponseStyle-Eigenschaft gibt an, wie ein Objekt auf die vorgeschlagene Bewegung reagiert, abhängig davon, ob das Objekt Anchored ist oder nicht.

EinstellungVerhalten bei VerankerungVerhalten ohne Verankerung
GeometricSowohl im laufenden Spiel als auch im Studio-Bearbeitungsmodus wird die Position/Ausrichtung eines verankerten Objekts aktualisiert, um die vorgeschlagene Bewegung genau widerzuspiegeln.Für ein nicht verankertes Objekt ist das Verhalten dasselbe wie für ein verankertes Objekt. Im laufenden Spiel wird das Objekt jedoch zu Beginn des Ziehens verankert und nach dem Loslassen des Ziehens wieder unverankert.
PhysicalEin verankertes Objekt hat standardmäßig das Verhalten Geometric, da es nicht von Kräften beeinflusst wird.Ein nicht verankertes Objekt wird durch Zwangskräfte bewegt, die versuchen, es in die gewünschte Position und/oder Ausrichtung zu bringen, die durch die vorgeschlagene Bewegung angegeben wird.
CustomDas Objekt wird sich überhaupt nicht bewegen, aber der DragFrame wird weiterhin aktualisiert, und Sie können auf die Ziehmanipulation reagieren, wie Sie möchten.(gleich wie verankert)

Achsen- und Bewegungsgrenzen

Standardmäßig gibt es keine Grenzen für 3D-Bewegungen über die inhärenten Einschränkungen des DragStyle hinaus. Wenn nötig, können Sie sowohl für die Translation als auch für die Rotation Mindest- und Höchstgrenzen anwenden. Beachten Sie jedoch, dass dies keine Einschränkungen sind; sie behindern lediglich die Versuche des Ziehdetektors, Bewegungen zu erzeugen, um innerhalb der Grenzen zu bleiben.

EigenschaftenBeschreibungStandard
MinDragTranslation
MaxDragTranslation
Begrenzungen für die Ziehübersetzung in jeder Dimension. Wenn MaxDragTranslation größer als MinDragTranslation ist, wird die Translation innerhalb dieses Bereichs begrenzt.(0, 0, 0)
MinDragAngle
MaxDragAngle
Nur relevant, wenn DragStyle auf RotateAxis gesetzt ist. Wenn MaxDragAngle größer als MinDragAngle ist, wird die Rotation innerhalb dieses Bereichs begrenzt.0

Ziehberechtigungen

Die Berechtigung von Spielern, mit einer bestimmten Ziehdetektorinstanz zu interagieren, kann über die PermissionPolicy-Eigenschaft festgelegt werden. Diese ist standardmäßig auf Enum.DragDetectorPermissionPolicy.Everybody gesetzt und kann auch geändert werden, um skriptgesteuerte Berechtigungssteuerungen zu unterstützen, wie im Codesample gezeigt.

EinstellungBeschreibung
NobodyKeine Spieler können mit dem DragDetector interagieren.
EverybodyAlle Spieler können mit dem DragDetector interagieren.
ScriptableDie Ziehberechtigungen der Spieler werden durch eine Funktion bestimmt, die über SetPermissionPolicyFunction() registriert wird. Bei dieser Einstellung verhindert das Versäumnis, eine Funktion zu registrieren oder ein ungültiges Ergebnis zurückzugeben, dass alle Spieler ziehen können.
DragDetector - Skriptierte Ziehberechtigung
local dragDetector = script.Parent.DragDetector
dragDetector.PermissionPolicy = Enum.DragDetectorPermissionPolicy.Scriptable
dragDetector:SetPermissionPolicyFunction(function(player, part)
if player and player:GetAttribute("IsInTurn") then
return true
elseif part and not part:GetAttribute("IsDraggable") then
return false
else
return true
end
end)

Physikalische Reaktion

Vorausgesetzt, der Reaktionsstil eines Ziehdetektors ist auf Physical eingestellt und er wird auf ein nicht verankertes Objekt angewendet, wird dieses Objekt durch Zwangskräfte bewegt, die versuchen, es in die durch die vorgeschlagene Bewegung angegebene Position/Ausrichtung zu bringen. Sie können die physikalische Reaktion weiter über die folgenden Eigenschaften anpassen:

EigenschaftBeschreibungStandard
ApplyAtCenterOfMassWenn falsch, wird die Ziehkraft an dem Punkt angewendet, auf den der Benutzer klickt. Wenn wahr, wird die Kraft am Schwerpunkt des Objekts angewendet.false
MaxForceMaximale Kraft, die angewendet wird, damit das Objekt sein Ziel erreicht.10000000
MaxTorqueMaximales Drehmoment, das angewendet wird, damit das Objekt sein Ziel erreicht.10000
ResponsivenessHöhere Werte bewirken, dass das Objekt schneller sein Ziel erreicht.10

Modifier-Eingabe

Einige DragStyle-Modi erlauben es Benutzern, eine Modifier-Taste/-Taste gedrückt zu halten, um das gezogene Objekt auf unterschiedliche Weise zu manipulieren. Standardmäßig ist der Modifier LeftControl auf PC, ButtonR1 auf Gamepad oder ButtonL2 auf VR. Sie können diese Modifier über die Eigenschaften KeyboardModeSwitchKeyCode, GamepadModeSwitchKeyCode oder VRSwitchKeyCode des Ziehdetektors anpassen.

Replikation

Wenn die RunLocally-Eigenschaft falsch (Standard) ist, interpretiert der Client alle Eingaben, um Daten zu erzeugen, die er an den Server sendet, um das Ziehen durchzuführen. In diesem Modus müssen alle benutzerdefinierten Ereignissignale und registrierten Funktionen im Server Scripts sein.

Wenn die RunLocally-Eigenschaft wahr ist, werden keine Ereignisse an den Server repliziert. Alle benutzerdefinierten Ereignissignale und registrierten Funktionen müssen in den Client LocalScripts sein, und Sie müssen Remote-Events verwenden, um notwendige Änderungen an den Server zu propagieren.

Skriptantworten auf Klicken und Ziehen

Durch Ereignissignale, Eigenschaftenänderungen, Scriptable Ziehstil und benutzerdefinierte Funktionen können Skripte auf die Manipulation gezogener Objekte reagieren, um die Benutzeroberfläche zu steuern oder logische Entscheidungen zu treffen, wie z.B. die Anpassung des Lichtniveaus in einem Raum basierend auf einem dimmbaren Wandschalter.

Ereignissignale

Durch die folgenden Ereignissignale können Sie erkennen, wann ein Benutzer mit dem Ziehen eines Objekts beginnt, fortfährt und aufhört.

EreignisBeschreibung
DragStartWird ausgelöst, wenn ein Benutzer mit dem Ziehen des Objekts beginnt.
DragContinueWird ausgelöst, wenn ein Benutzer das Ziehen des Objekts fortsetzt, nachdem DragStart initiiert wurde.
DragEndWird ausgelöst, wenn ein Benutzer das Ziehen des Objekts stoppt.
DragDetector - Ereignissignale
local dragDetector = script.Parent.DragDetector
local highlight = Instance.new("Highlight")
highlight.Enabled = false
highlight.Parent = script.Parent
dragDetector.DragStart:Connect(function()
highlight.Enabled = true
end)
dragDetector.DragContinue:Connect(function()
end)
dragDetector.DragEnd:Connect(function()
highlight.Enabled = false
end)

Änderungen des Ziehrahmens

Zusätzlich zu Ereignissignalen können Sie Änderungen am DragFrame des Detektors direkt überwachen.

DragDetector - Änderungen am DragFrame
local dragDetector = script.Parent.DragDetector
dragDetector:GetPropertyChangedSignal("DragFrame"):Connect(function()
local currentDragTranslation = dragDetector.DragFrame.Position
print(currentDragTranslation)
end)

Skriptierter Ziehstil

Wenn Sie den DragStyle eines Detektors auf Scriptable setzen, können Sie Ihre eigene Funktion bereitstellen, die einen Ray entgegennimmt und eine Weltposition CFrame zurückgibt. Der Detektor wird die Bewegung so anpassen, dass das gezogene Objekt an diesen benutzerdefinierten Ort/Ausrichtung gelangt.

DragDetector - Skriptierter Ziehstil
local Workspace = game:GetService("Workspace")
local dragDetector = script.Parent.DragDetector
dragDetector.DragStyle = Enum.DragDetectorDragStyle.Scriptable
local cachedHitPoint = Vector3.zero
local cachedHitNormal = Vector3.yAxis
local function followTheCursor(cursorRay)
-- Ziehen Sie das gezogene Objekt von der Raycast-Erkennung aus
local raycastParams = RaycastParams.new()
raycastParams.FilterDescendantsInstances = {dragDetector.Parent}
raycastParams.FilterType = Enum.RaycastFilterType.Exclude
local hitPoint = Vector3.zero
local hitNormal = Vector3.yAxis
local raycastResult = Workspace:Raycast(cursorRay.Origin, cursorRay.Direction, raycastParams)
if raycastResult then
hitPoint = raycastResult.Position
hitNormal = raycastResult.Normal.Unit
else
hitPoint = cachedHitPoint
hitNormal = cachedHitNormal
end
cachedHitPoint = hitPoint
cachedHitNormal = hitNormal
local lookDir1 = hitNormal:Cross(Vector3.xAxis)
local lookDir2 = hitNormal:Cross(Vector3.yAxis)
local lookDir = if lookDir1.Magnitude > lookDir2.Magnitude then lookDir1.Unit else lookDir2.Unit
return CFrame.lookAt(hitPoint, hitPoint + lookDir, hitNormal)
end
dragDetector:SetDragStyleFunction(followTheCursor)

Benutzerdefinierte Einschränkungsfunktion

Ziehdetektoren haben keine integrierten Bewegungsregeln für Raster und Snapping, aber Sie können benutzerdefinierte Einschränkungsfunktionen registrieren, um den DragFrame zu bearbeiten, bevor er angewendet wird. Zum Beispiel können Sie die Bewegung auf einem Raster halten, indem Sie Positionen auf Vielfache des Rasterinkrements runden oder ein Schachspiel mit Bewegungsregeln simulieren, die für jedes Stück legal sind.

DragDetector - Benutzerdefinierte Einschränkungsfunktion
local dragDetector = script.Parent.DragDetector
local startPartPosition = nil
local SNAP_INCREMENT = 4
dragDetector.DragStart:Connect(function()
startPartPosition = script.Parent.Position
end)
dragDetector.DragEnd:Connect(function()
startPartPosition = nil
end)
local function snapToWorldGrid(proposedMotion)
if startPartPosition == nil then
return proposedMotion
end
local snapIncrement = SNAP_INCREMENT // 1
if snapIncrement < 1 then
return proposedMotion
end
local newWorldPosition = startPartPosition + proposedMotion.Position
local roundedX = ((newWorldPosition.X / snapIncrement + 0.5) // 1) * snapIncrement
local roundedY = ((newWorldPosition.Y / snapIncrement + 0.5) // 1) * snapIncrement
local roundedZ = ((newWorldPosition.Z / snapIncrement + 0.5) // 1) * snapIncrement
local newRoundedWorldPosition = Vector3.new(roundedX, roundedY, roundedZ)
return proposedMotion.Rotation + (newRoundedWorldPosition - startPartPosition)
end
local connection = dragDetector:AddConstraintFunction(2, snapToWorldGrid)
-- Wenn zutreffend, entfernen Sie die Einschränkungsfunktion, indem Sie connection:Disconnect() aufrufen

Beispielverwendung

Nicht verankerte physikalische Objekte

Eine grundlegende Implementierung von Ziehdetektoren ist ein Turm-Balance-Spiel, bei dem die Spieler vorsichtig Teile entfernen und versuchen müssen, den Turm aufrecht zu halten. In der folgenden Turmstruktur hat jedes Stück einen untergeordneten DragDetector mit dem Standard-DragStyle von TranslatePlane, sodass die Spieler die Teile nach außen ziehen, aber nicht nach oben oder unten.

Verankerte Modelle mit verstellbaren Teilen

Sie können ganz einfach Modelle erstellen und teilen, die hauptsächlich verankert sind, aber ein oder mehrere untergeordnete Teile/Modelle haben, die die Spieler ziehen können. Zum Beispiel hat der folgende Schreibtisch zwei Schubladen, die die Spieler öffnen können, um zu inspizieren, was sich darin befindet.

Ziehdetektoren und Einschränkungen

Sie können Ziehdetektoren mit Constraints kombinieren, zum Beispiel mit einer Marionettenpuppe. In der folgenden Konfiguration sind die Steuergriffe verankert, die Körperteile sind nicht verankert, und Einschränkungen halten die Marionette zusammen. Das Bewegen der Griffe mit dem TranslateViewPlane DragStyle lässt die Marionette tanzen, und die einzelnen Körperteile können ebenfalls mit Ziehdetektoren bewegt werden, während das Modell seine Integrität behält.

3D-Benutzeroberflächen

3D-Benutzeroberflächen sind leicht durch Ziehdetektoren erreichbar, wie z.B. die Anpassung der Helligkeit eines SpotLight basierend auf einem dimmbaren Schalter. Sie können auch die X- und Z-Achsen einzeln erkennen, um zwei verschiedene Aspekte einer 3D-Benutzeroberfläche zu steuern, wie die Size, Speed und Color eines ParticleEmitter.

DragDetector - 3D-Benutzeroberfläche
local model = script.Parent
local slider = model.SliderPart
local originPart = model.OriginPart
local emitter = script.Parent.EmitterPart.ParticleEmitter
local dragDetector = slider.DragDetector
dragDetector.ReferenceInstance = originPart
dragDetector.MinDragTranslation = Vector3.zero
dragDetector.MaxDragTranslation = Vector3.new(10, 0, 10)
local dragRangeX = dragDetector.MaxDragTranslation.X - dragDetector.MinDragTranslation.X
local dragRangeZ = dragDetector.MaxDragTranslation.Z - dragDetector.MinDragTranslation.Z
local MIN_PARTICLE_SIZE = 1
local MAX_PARTICLE_SIZE = 1.5
local MIN_PARTICLE_SPEED = 2.5
local MAX_PARTICLE_SPEED = 5
local COLOR1 = Color3.fromRGB(255, 150, 0)
local COLOR2 = Color3.fromRGB(255, 0, 50)
local function updateParticles(emitter)
local dragFactorX = (dragDetector.DragFrame.Position.X - dragDetector.MinDragTranslation.X) / dragRangeX
local dragFactorZ = (dragDetector.DragFrame.Position.Z - dragDetector.MinDragTranslation.Z) / dragRangeZ
-- Passen Sie die Partikelgröße und -geschwindigkeit basierend auf dem Ziehdetektor-X-Faktor an
emitter.Size = NumberSequence.new{
NumberSequenceKeypoint.new(0, 0),
NumberSequenceKeypoint.new(0.1, MIN_PARTICLE_SIZE + ((MAX_PARTICLE_SIZE - MIN_PARTICLE_SIZE) * dragFactorX)),
NumberSequenceKeypoint.new(1, 0)
}
local speed = MIN_PARTICLE_SPEED + ((MAX_PARTICLE_SPEED - MIN_PARTICLE_SPEED) * dragFactorX)
emitter.Speed = NumberRange.new(speed, speed * 1.2)
-- Passen Sie die Partikelfarbe basierend auf dem Ziehdetektor-Z-Faktor an
local color = COLOR2:Lerp(COLOR1, dragFactorZ)
emitter.Color = ColorSequence.new{
ColorSequenceKeypoint.new(0, color),
ColorSequenceKeypoint.new(1, color)
}
end
dragDetector:GetPropertyChangedSignal("DragFrame"):Connect(function()
updateParticles(emitter)
end)
©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.