Die DragDetector Instanz erleichtert und ermutigt die Interaktion mit 3D-Objekten in einem Erlebnis, wie das Öffnen von Türen und Schubladen, das Schieben eines Teils um, das Ergreifen und das Wurfeln eines Bowlingballs, das Rückziehen und das Feuern eines Slingshots und vieles mehr. Key-Funktionen beinhalten:
Platieren Sie einen DragDetector unter einem BasePart oder Model um 2>make it draggable2> über alle Eingänge (Maus, Touch, Gamepad und VR), all ohne eine einzige Zeile Codes.
Wählen Sie aus mehreren Ziehstilen, definieren Sie, wie das Objekt auf Bewegung reagiert, und optionale Achslimits anwenden.
Skripte können auf die Manipulation von gedrückten Objekten antworten, um die Benutzeroberfläche zu fahren oder logische Entscheidungen zu treffen, z. B. das Anpassen des Lichtniveaus in einem Raum basierend auf einem Sliding Wall Switch-Dimmer.
Spieler können verankerte Teile oder Modelle manipulieren, und sie bleiben genau dort, wo du sie beim Freigeben platziert hast.
Class.DragDetector|DragDetectors arbeiten in Studio, solange Sie nicht mit dem Auswählen , Bewegen , 0> Skalieren 0> oder DragDetectors3>-Werkzeugen testen und anpassen, um das Testen und Anpassen von Ziehbaren Objekten zu erleichtern.
Objekte ziehbar machen
Um ein Teil oder ein Modell ziehbar zu machen, füge einfach einen DragDetector als direkten Nachfolgerhinzu.
In dem Explorer-Fenster bewegen Sie den Mauszeiger über die Part, MeshPart oder 1> Class.Model1> und klicken Sie auf die Schaltfläche ⊕ . Ein Kontextmenü wird angezeigt.
Von dem Menü, fügen Sie einen DragDetector ein.
Standardmäßig wird das Objekt jetzt in der Bodenplane ziehbar sein, aber du kannst seine <a href="/reference/engine/datatypes">Class.DragDetector.DragStyle|DragStyle</a> anpassen, definieren, wie es auf Bewegung reagiert, und optionale <a href="/reference/engine/datatypes">Achsen oder Bewegungslimits</a> anwenden.
Ziehpunkte-Detektor anpassen
Ziehen-Stil
DragDetectors map cursor movement to virtual lines and planes to calculate proposed 3D movement. Through the DragStyle Eigenschaften, you can choose from different mappings to suit your needs. For example, TranslatePlane produziert Übersetzung in einem virtuellen Plane, während 0> RotateAxis 0> Rotation um
Einstellungen | Beschreibung |
---|---|
TranslateLine | 1D-Bewegung entlang der Achse des Detektors Axis , standardmäßig die Weltachse Y . |
TranslatePlane | 2D-Bewegung im Flugzeug perpendikular zum Detektor, standardmäßig die Flugzeug-X Axis . |
TranslatePlaneOrLine | 2D-Bewegung im Flugzeug perpendikular zum Detektor und, wenn der Axis -Modifikator aktiv ist, 1D-Bewegung entlang der Class.DragDetector.Axis|Axis des Detektors. |
TranslateLineOrPlane | 1D-Bewegung entlang der Achse des Axis und, wenn der Modifier aktiv ist, 2D-Bewegung im Flugzeug in Richtung des Axis . |
TranslateViewPlane | 2D-Bewegung im Flugzeug in Richtung Kamera. In diesem Modus wird das Flugzeug ständig aktualisiert, auch wenn Sie es ziehen, und wird immer die aktuelle Ansicht der Kamera ausrichten. |
RotateAxis | Drehung um die Axis des Detektors, standardmäßig die Y-Achse. |
RotateTrackball | Trackball-Rotation, weiter anpassbar durch die TrackballRadialPullFactor und TrackballRollFactor-Eigenschaften. |
BestForDevice | TranslatePlaneOrLine für Maus und Gamepad; TranstranslatePlane für Touch; 6DOF für VR. |
Scriptable | Berechnet die gewünschte Bewegung über eine benutzerdefinierte Funktion, die über SetDragStyleFunction() bereitgestellt wird. |
Richtung ziehen
Standardmäßig 3D-Bewegung und die zugeordnete DragStyle Karte in den Platz. Sie möchten jedoch möglicherweise die ReferenceInstance , Orientation oder 1>
Eigenschaft | Beschreibung | Standard |
---|---|---|
ReferenceInstance | Eine Instanz, deren Pivot den Referenzrahmen bereitstellt für den Drag-Detektor. Der Class.DragDetector.DragFrame|DragFrame wird bezogen auf diesen Referenzrahmen ausgedrückt, der abrufbar über Class.DragDetector:GetreferenceFrame()|GetreferenceFrame | nil |
Orientation | Gibt die YXZ Rotation der Achsen der Bewegung in Bezug auf den Referenzrahmen (ändert nicht die Ausrichtung des Referenzrahmens selbst). Die lineare Translation und die Achsenverschiebung werden auf dieser Y -Achse sein, und die Planar-Translation in der X -Ebene. Ändern dieser Werte aktualisiert automatisch 1> Class.DragDetector. | (0, 0, 0) |
Axis | Die Hauptachse der Bewegung, ausgedrückt in Bezug auf den Verweisungsrahmen. Ändern dieses Wertes aktualisiert automatisch Orientation und vice versa. | (0, 1, 0) |
Antwort auf Bewegung
Die ResponseStyle Eigenschaft spezifiziert, wie ein Objekt auf die vorgeschlagene Bewegung reagiert, abhängig davon, ob das Objekt Anchored oder nicht ist.
Einstellungen | Verankertes Verhalten | Verankertes Verhalten |
---|---|---|
Geometric | In der laufenden Erfahrung und im Studio-Bearbeitungsmodus wird die Position/Ausrichtung eines verankerten Objekts aktualisiert, um genau den vorgeschlagenen Bewegung zu widerspiegeln. | Für ein nicht verankertes Objekt ist das Verhalten wie für ein verankertes Objekt. In einer laufenden Erlebniswird das Objekt jedoch bei der Start des Drag und wiederhergestellt, und bei der Drag-Freigabe auf das nicht verankerte zurückgesetzt. |
Physical | Ein verankertes Objekt wird standardmäßig auf Geometrisches Verhalten eingestellt, da es von Kräften nicht betroffen wird. | Ein nicht verankertes Objekt wird durch Einschränkungskräfte bewegt, die versuchen, es an die gewünschte Position und/oder Ausrichtung zu bringen, die dem vorgeschlagenen Bewegung gegeben wird. |
Custom | Das Objekt bewegt sich Allenicht, aber DragFrame wird immer noch aktualisiert und du kannst auf die Zieh-Manipulation antworten, wie du willst. | (gleich wie verankert) |
Achsen- & Bewegungslimits
Standardmäßig gibt es keine Einschränkungen für 3D-Bewegungen jenseits der angenommenen Einschränkungen des DragStyle. Wenn nötig, können Sie minimale und maximale Grenzen für die Übersetzung und Rotation anwenden. Beachten Sie jedoch, dass diese nicht sind Einschränkungen , sie behindern nur die Versuche des Drag-Detektors, um in Grenzen zu bleiben.
Eigenschaften | Beschreibung | Standard |
---|---|---|
Class.DragDetector.MinDragTranslation|MinDragTranslation``Class.DragDetector.MaxDragTranslation|MaxDragTranslation | Beschränkungen für die Übersetzung in jeder Dimension. Wenn MaxDragTranslation größer ist als MinDragTranslation, wird die Übersetzung innerhalb dieses Bereichs geklemmt. | (0, 0, 0) |
Class.DragDetector.MinDragAngle|MinDragAngle``Class.DragDetector.MaxDragAngle|MaxDragAngle | Nur relevant, wenn DragStyle auf RotateAxis eingestellt ist. Wenn MaxDragAngle größer ist als 1> Class.DragDetector.MinDragAngle|MinDragAngle1>, wird dieRotation innerhalb dieses Bereichs geklemmt. | 0 |
Zulassung ziehen
Die Berechtigung der Spieler, mit einer bestimmten Ziehpunkte-Instanz zu interagieren, kann mit der Class.DragDetector.Permission Policy|Permission PolicyEigenschaftenspezifiziert werden. Dies wird standardmäßig auf Everybody gesetzt, und es kann auch geändert werden, um skriptbasierte Berechtigungskontrollen zu unterstützen, wie in dem Codebeispiel gezeigt.
Einstellungen | Beschreibung |
---|---|
Nobody | Keine Spieler können mit dem DragDetector interagieren. |
Everybody | Alle Spieler können mit dem DragDetector interagieren. |
Scriptable | Spieler's Drag Permissions werden durch eine Funktion festgelegt, die über SetPermissionPolicyFunction() registriert ist. Unter dieser Einstellung verhindert das Fehlen der Registrierung einer Funktion oder das Rückgeben eines ungültigen Ergebnisses, dass alle Spieler nicht ziehen. |
DragDetector - Scripted Drag Berechtigung
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)
Physics-Antwort
Assume a dragger's Antwortstil is set to Physical and it is applied to an unanchored Objekt, that object will be moved by束 forces that attempt to bring it to the position/orientation given by the proposed motion. You can further customize the physical response through the following properties:
Eigenschaft | Beschreibung | Standard |
---|---|---|
ApplyAtCenterOfMass | Wenn falsch, wird Kraft an der Stelle angewendet, an der der Benutzer klickt. Wenn es wahr ist, wird Kraft an der Mitte der Objektzentrierung angewendet. | falsch |
MaxForce | Maximale Kraft wird für das Objekt angewendet, um sein Ziel zu erreichen. | 100.000.000 |
MaxTorque | Maximaler Drehmoment für das Objekt, um sein Ziel zu erreichen. | 10 |
Responsiveness | Höhere Werte ermöglichen es dem Objekt, sein Ziel schneller zu erreichen. | 10 |
Eingabe modifizieren
Replikation
Wenn die Eigenschaft RunLocally falsch ist (Standard), interpretiert der Client alle Eingaben, um Daten zu erzeugen, die an den Server gesendet werden, um den Drag auszuführen. In diesem Modus müssen alle benutzerdefinierten Ereignissignale und registrierte Funktionen in dem Server Scripts sein.
Wenn die Eigenschaft RunLocally wahr ist, werden keine Ereignisse auf den Server repliziert. Alle benutzerdefinierten Ereignissignale und registrierte Funktionen müssen in LocalScripts des Clients sein und Sie müssen Remote-Ereignisse verwenden, um notwendige Änderungen am Server zu propagieren.
Skript-Reaktionen auf Klicken und Ziehen
Durch Ereignis-Signale , Eigenschaftsänderungen, Scriptable Drag-Stil und benutzerdefinierte Funktionen, können Skripte auf die Manipulation von gedrückten Objekten reagieren, um die Interaktion mit dem Ziehen von Objekten zu steuern, um die Lichtstufe in einem Raum basierend auf einem Sliding Wall Switch-Dimmer anzupassen.
Ereignissignale
Mit den folgenden Ereignissignalen können Sie erkennen, wenn ein Benutzer beginnt, ein Objekt zu ziehen, und es fortsetzt und beendet.
Ereignis | Beschreibung |
---|---|
DragStart | Feuert, wenn ein Benutzer das Objekt anfängt, es zu ziehen. |
DragContinue | Feuert, wenn ein Benutzer das Objekt weiter zieht, nachdem Class.DragDetector.DragStart|DragStart initiiert wurde. |
DragEnd | Feuert, wenn ein Benutzer das Objekt aufhört zu ziehen. |
Ziehhilfe - 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)
Rahmen-Änderungen ziehen
Zusätzlich zu Ereignissignalen können Sie Änderungen am DragFrame des Detectors direkt überwachen.
ZiehenDetektor - ZiehenFrame Änderungen
local dragDetector = script.Parent.DragDetector
dragDetector:GetPropertyChangedSignal("DragFrame"):Connect(function()
local currentDragTranslation = dragDetector.DragFrame.Position
print(currentDragTranslation)
end)
Scripted Drag Stil
Wenn Sie ein DragStyle an Skriptable setzen, können Sie Ihre eigene Funktion bereitstellen, die ein Ray nimmt und eine Weltraum-1> Datatype.CFrame1> zurückgibt. Der Dektor bewegt die Bewegung, damit das gesch拖对象 an diese benutzerdefinierte Position/Ausrichtung geht.
DragDetector - Scripted DragStyle
local dragDetector = script.Parent.DragDetector
dragDetector.DragStyle = Enum.DragDetectorDragStyle.Scriptable
local cachedHitPoint = Vector3.zero
local cachedHitNormal = Vector3.yAxis
local function followTheCursor(cursorRay)
-- Schließe das ziehbare 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 Konstruktionsfunktion
Zieh-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-Detektor-
DragDetector - Benutzerdefinierte Konstruktionsfunktion
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 = math.floor(SNAP_INCREMENT)
if snapIncrement < 1 then
return proposedMotion
end
local newWorldPosition = startPartPosition + proposedMotion.Position
local roundedX = math.floor(newWorldPosition.X / snapIncrement + 0.5) * snapIncrement
local roundedY = math.floor(newWorldPosition.Y / snapIncrement + 0.5) * snapIncrement
local roundedZ = math.floor(newWorldPosition.Z / snapIncrement + 0.5) * snapIncrement
local newRoundedWorldPosition = Vector3.new(roundedX, roundedY, roundedZ)
return proposedMotion.Rotation + (newRoundedWorldPosition - startPartPosition)
end
local connection = dragDetector:AddConstraintFunction(2, snapToWorldGrid)
-- When applicable, remove the constraint function by invoking connection:Disconnect()
Beispiel-Verwendung
Verankerte physikalische Objekte
Eine grundlegende Umsetzung von Drag Detektoren ist ein Turm-Ausgleichsspiel, bei dem Spieler die Teile sorgfältig entfernen müssen und versuchen, den Turm aufrechtzuerhalten. In der folgenden Turmstruktur hat jedes Stück ein Kind DragDetector mit einem Standard DragStyle von TranslatePlane , damit Spieler die Te
Verankerte Modelle mit anpassbaren Teilen
Du kannst leicht erzeugen und teilen, modelle, die hauptsächlich ancornt sind, aber ein oder mehrere kinderteile/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 in ihnen ist.
Ziehen Sie Sensoren und Einschränkungen
Du kannst Drag-Detektoren mit Constraints kombinieren, z. B. eine Marionetten-Puppe. Im folgenden Setup sind die Control-Griffe verankert, die Körperteile sind nicht verankert und die Einschränkungen halten die Marionette zusammen. Wenn du die Griffe mit dem TranslateViewPlane
3D-Benutzeroberflächen
3D-Benutzeroberflächen sind leicht durch Drag-Detektorachter wie Anpassung der Helligkeit eines SpotLight basierend auf einem Sliding Switch-Dimmer zu erreichen. Sie
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
-- Zur Anpassung der Partikelgröße und -geschwindigkeit basierend auf dem X-Faktor des Ziehpunktes
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)
-- Zur Anpassung der Partikelfarbe basierend auf dem Z-Faktor des Drag Detectors
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)