3D-Draggerschutz

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

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

  2. Von dem Menü, fügen Sie einen DragDetector ein.

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

EinstellungenBeschreibung
TranslateLine1D-Bewegung entlang der Achse des Detektors Axis , standardmäßig die Weltachse Y .
TranslatePlane2D-Bewegung im Flugzeug perpendikular zum Detektor, standardmäßig die Flugzeug-X Axis .
TranslatePlaneOrLine2D-Bewegung im Flugzeug perpendikular zum Detektor und, wenn der Axis -Modifikator aktiv ist, 1D-Bewegung entlang der Class.DragDetector.Axis|Axis des Detektors.
TranslateLineOrPlane1D-Bewegung entlang der Achse des Axis und, wenn der Modifier aktiv ist, 2D-Bewegung im Flugzeug in Richtung des Axis .
TranslateViewPlane2D-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.
RotateAxisDrehung um die Axis des Detektors, standardmäßig die Y-Achse.
RotateTrackballTrackball-Rotation, weiter anpassbar durch die TrackballRadialPullFactor und TrackballRollFactor-Eigenschaften.
BestForDevice TranslatePlaneOrLine für Maus und Gamepad; TranstranslatePlane für Touch; 6DOF für VR.
ScriptableBerechnet 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>

EigenschaftBeschreibungStandard
ReferenceInstanceEine 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()|GetreferenceFramenil
OrientationGibt 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)
AxisDie 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.

EinstellungenVerankertes VerhaltenVerankertes Verhalten
GeometricIn 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.
PhysicalEin 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.
CustomDas 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.

EigenschaftenBeschreibungStandard
Class.DragDetector.MinDragTranslation|MinDragTranslation``Class.DragDetector.MaxDragTranslation|MaxDragTranslationBeschrä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|MaxDragAngleNur 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.

EinstellungenBeschreibung
NobodyKeine Spieler können mit dem DragDetector interagieren.
EverybodyAlle Spieler können mit dem DragDetector interagieren.
ScriptableSpieler'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:

EigenschaftBeschreibungStandard
ApplyAtCenterOfMassWenn 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
MaxForceMaximale Kraft wird für das Objekt angewendet, um sein Ziel zu erreichen.100.000.000
MaxTorqueMaximaler Drehmoment für das Objekt, um sein Ziel zu erreichen.10
ResponsivenessHö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.

EreignisBeschreibung
DragStartFeuert, wenn ein Benutzer das Objekt anfängt, es zu ziehen.
DragContinueFeuert, wenn ein Benutzer das Objekt weiter zieht, nachdem Class.DragDetector.DragStart|DragStart initiiert wurde.
DragEndFeuert, 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)