L'istanza DragDetector facilita e incoraggia l'interazione con gli oggetti 3D in un'esperienza, come aprire porte e armadietti, scorrevole una parte intorno, prendere e lanciare una palla da bowling, tirare indietro e sparare un proiettile, e molto altro. Le caratteristiche chiave includono:
Posiziona un DragDetector sotto qualsiasi BasePart o Model per 2> renderizzarlo2> tramite tutti gli input (Topo, or mouse as computer mouse, tocco, gamepad e VR), tutto senza una sola riga di codice.
Scegli da diversi stili di trascinamento, definisci come l'oggetto risponde al movimento e opzionalmente applica 限i di asse o di movimento.
Gli script possono rispondere alla manipolazione di oggetti trascinati per guidare l'interfaccia utente o prendere decisioni logiche, come regolare il livello della luce in una stanza in base a un dimmer di parete scorrevole.
I giocatori possono manipolare parti o modelli ancorati e rimarranno esattamente dove li hai messi quando sei rilasciato.
Class.DragDetector|DragDetectors lavora in Studio finché non sei non usando il seleziona , 0> muovi0> , 3> scala3> , o DragDetectors6> strumenti, rendendo più facile testare e regolare gli oggetti trascinabili mentre modifichi.
Rendere gli oggetti trascinabili
Per rendere qualsiasi parte o modello trascinabile, semplicemente aggiungi un DragDetector come DIscendentediretto.
Dal menu, inserisci un DragDetector .
Per impostazione predefinita, l'oggetto ora sarà trascinabile nel piano di terra, ma puoi personalizzare il suo DragStyle , definire come risponde al movimento e opzionalmente applicare limiti di assi o di movimento .
Personalizzare i sensori di trascinamento
Stile di trascinamento
DragDetectors la mappa cursor movimento sui virtuali linee e aerei per calcolare la proposta 3D movimento. Attraverso la ProprietàDragStyle, puoi scegliere da differenti mappe per adattarsi alle tue esigenze. Ad esempio, Traslat
Impostazione | Descrizione |
---|---|
TranslateLine | 1D movimento lungo l'asse del Axis , per impostazione predefinita il mondo Y asse. |
TranslatePlane | 2D motion in the plane perpendicular to the detector's Axis , by default the world XZ plane. |
TranslatePlaneOrLine | 2D motion in the plane perpendicular to the detector's Axis and, when the modifier is active, 1D motion along the detector's Axis . |
TranslateLineOrPlane | 1D movimento lungo l'asse del Axis e, quando il modificatore è attivo, 2D movimento nel piano perpendolare all'asse del Axis . |
TranslateViewPlane | 2D motion in the plane perpendicular to the Telecamera's vista. In this mode, the plane is constantly updated, even while dragging, and will always face the Telecamera's current vista. |
RotateAxis | Rotazione attorno all'asse del Axis del detector, per impostazione predefinita il mondo Y asse. |
RotateTrackball | Rotazione della palla di traccia, ulteriormente personalizzata attraverso le proprietà TrackballRadialPullFactor e TrackballRollFactor. |
BestForDevice | TraducePlaneOrLine per mouse e gamepad; TraducePlane per tocco; 6DOF per VR. |
Scriptable | Calcola la velocità desiderata tramite una funzione personalizzata fornita attraverso SetDragStyleFunction() . |
Direzione di spostamento
Per impostazione predefinita, la mappa 3D e la relativa mappa DragStyle nel spazio del Spazio. Tuttavia, potresti voler cambiare la mappa ReferenceInstance , Class.DragDetector.Orientation|Orientation
Proprietà | Descrizione | Predefinito |
---|---|---|
ReferenceInstance | Un'istanza il cui pivot fornisce il Frame di riferimento per il rilevatore di trascinamento. Il DragFrame viene espresso rispetto a questoFrame di riferimento che può essere recuperato tramite Class.DragDetector:GetReferenceFrame()| | nil |
Orientation | Specifica la rotazione YXZ dei trascinatori di movimento rispetto alla referenza (non cambia l'orientamento della referenza stessa). La traduzione lineare e la rotazione axiale saranno su questo asse Y e la traduzione planare in X piano. La modifica di questo valore aggiorna automaticamente 1> Class.DragDetector.Axis|Axis1> e viceversa. | (0, 0, 0) |
Axis | L'asse principale della moto, espresso in relazione al riferimento. Cambiando questo valore aggiorna automaticamente Orientation e viceversa. | (0, 1, 0) |
Risposta alla manovra
La proprietà ResponseStyle specifica come un oggetto risponde alla proposta di movimento, a seconda se l'oggetto è Anchored o no.
Impostazione | Comporto ancorato | Comportamento non ancorato |
---|---|---|
Geometric | Sia all'interno dell'esperienza in esecuzione che in modalità di modifica dello Studio, la posizione / orientamento di un oggetto ancorato sarà aggiornata per riflettere esattamente la moto proposta. | Per un oggetto non ancorato, il comportamento è lo stesso di un oggetto ancorato. Tuttavia, in un'esperienza in esecuzione, l'oggetto sarà ancorato all'inizio del trascinamento e恢复 a un ancorato dopo il rilascio del trascinamento. |
Physical | Un oggetto ancorato prenderà il valore predefinito di Geometrico comportamento, poiché non è influenzato dalle forze. | Un oggetto non ancorato sarà spostato da forze di restrizione che tentano di portarlo alla posizione e/o all'orientamento desiderati dalle proposte di movimento. |
Custom | L'oggetto non si muoverà tutti/tutte, ma DragFrame sarà ancora aggiornato e puoi rispondere alla manipolazione di trascinamento in base a come ti piace. | (lo stesso che è ancorato) |
Limitazioni di asse e movimento
Per impostazione predefinita, non ci sono limiti alla 3D motion oltre alle restrizioni intrinseche del DragStyle . Se necessario, puoi applicare i limiti minimo e massimo sia alla traduzione che alla rotazione. Nota, tuttavia, che questi non sono limiti; essi semplicemente impediscono al drag detector di generare il movimento per rimanere entro i limiti.
Proprietà | Descrizione | Predefinito |
---|---|---|
Class.DragDetector.MinDragTranslation|MinDragTranslation``Class.DragDetector.MaxDragTranslation|MaxDragTranslation | Limitazioni per trascinare la traduzione in ogni dimensione. Se MaxDragTranslation è maggiore di MinDragTranslation, la traduzione verrà appiattita in quel raggio. | (0, 0, 0) |
Class.DragDetector.MinDragAngle|MinDragAngle``Class.DragDetector.MaxDragAngle|MaxDragAngle | Rilevante solo se DragStyle è impostato su RotateAxis . Se MaxDragAngle è maggiore di 1> Class.DragDetorer.MinDragAngle|MinDragAngle1>, la rotazione sarà fissata all'interno di tale raggio. | 0 |
Ruota l'autorizzazione
Il permesso dei giocatori di interagire con un determinato drag detector istanza può essere specificato dalla proprietà PermissionPolicy. Questo è impostato su Enum.DragDetectorPermissionPolicy.Everybody per impostazione predefinita, e può essere cambiato per supportare controlli di autorizzazione scriptati come mostrato nel codice di esempio.
Impostazione | Descrizione |
---|---|
Nobody | Nessun giocatore può interagire con il DragDetector . |
Everybody | Tutti i giocatori possono interagire con il DragDetector . |
Scriptable | I permessi di trascinamento dei giocatori saranno determinati da una funzione registrata attraverso SetPermissionPolicyFunction() . Under this Configurazione, il fallimento della registrazione di una funzione o il ritorno di un risultato non valido impedirà a tutti i giocatori di trascinare. |
DragDetector - Scripted Permesso di Drag
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)
Risposta fisica
Assumere che lo stile di risposta di un dragger è impostato su Fisico e viene applicato a un oggetto non ancorato, quell'oggetto sarà spostato dalle forze di vincolo che cercano di portarlo alla posizione/orientamento specificati dal movimento proposto. Puoi ulteriormente personalizzare la risposta fisica attraverso le seguenti proprietà:
Proprietà | Descrizione | Predefinito |
---|---|---|
ApplyAtCenterOfMass | Quando falso, la forza di trascinamento viene applicata al punto in cui l'utente fa clic. Quando vero, la forza viene applicata al centro di massa dell'oggetto. | falso |
MaxForce | Forza massima applicata per l'oggetto per raggiungere il suo obiettivo. | 100.000.000 |
MaxTorque | Torque massimo applicato per l'oggetto per raggiungere il suo obiettivo. | 10000 |
Responsiveness | I valori più alti fanno in modo che l'oggetto raggiunga il suo obiettivo più rapidamente. | 10 |
Inserimento di Modificatori
Replicazione
Quando la proprietà RunLocally è falsa (predefinito), il client interpreta tutte le input per generare i dati che invia al server per eseguire il trascinamento. In questo modo, tutti i segnali di eventi personalizzati e le funzioni registrate devono essere in server Scripts .
Quando la proprietà RunLocally è vera, nessun evento viene replicato al Server. Tutti i segnali e le funzioni personalizzate devono essere in client LocalScripts e devi usare eventi remoti per propagare le modifiche necessarie al Server.
Scripting Risposte al Clicca e Dragga
Attraverso segnali di eventi , le modifiche delle proprietà, Scriptable stile di拖, e funzioni personalizzate, gli script possono rispondere alla manipolazione di oggetti trascinati per guidare l'interfaccia utente o prendere decisioni logiche, come regolare il livello della luce in una stanza in base a un dimmer di parete scorrevole.
Segnali di evento
Attraverso i seguenti segnali di evento, puoi rilevare quando un utente inizia, continua e finisce trascinando un oggetto.
Evento | Descrizione |
---|---|
DragStart | Si attiva quando un utente inizia a trascinare l'oggetto. |
DragContinue | Si attiva quando un utente continua a trascinare l'oggetto dopo che DragStart è stato inizializzato. |
DragEnd | Si attiva quando un utente smette di trascinare l'oggetto. |
DragDetector - Segnali di eventi
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)
Trascina le modifiche della schermata
Oltre a segnali di eventi, puoi monitorare le modifiche al DragFrame del detector direttamente.
DragDetector - Change di DragFrame
local dragDetector = script.Parent.DragDetector
dragDetector:GetPropertyChangedSignal("DragFrame"):Connect(function()
local currentDragTranslation = dragDetector.DragFrame.Position
print(currentDragTranslation)
end)
Stile di trascinamento scriptato
Se impostate il DragStyle di un detector su Scriptable , potete fornire la vostra funzione che prende in un Ray e restituisce un oggetto mondiale 1> Datatype.CFrame1> . Il detector si muoverà il movimento in modo che l'oggetto trascinato vada in quella posizione / orientamento personalizzato.
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)
-- Escludi l'oggetto trascinato dalla rilevazione del raycast
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)
Funzione di Con限azione Personalizzata
I rilevatori di trascinamento non hanno regole di movimento integrate su griglie e avvolgimento, ma puoi registrare funzioni di vincolo personalizzate per modificare il rilevatore DragFrame prima di applicarlo. Ad esempio, puoi mantenere il movimento su una griglia rounding position to multiples of the grid increment, o simulare un gioco di scacchi con regole di movimento legali per ciascuna parte.
DragDetector - Funzione di Constraint personalizzata
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()
Esempio di Utilizzo
Oggetti fisici non ancorati
Un gioco di base di rilevatori di trascinamento è un gioco di equilibrio della torre in cui i giocatori devono rimuovere con attenzione le parti e tentare di mantenere la torre in piedi. Nella seguente struttura della torre, ogni parte ha un figlio DragDetector con un'impostazione predefinita DragStyle di TrasportaPl
Modelli ancorati con parti regolabili
Puoi facilmente creare e condividere modelli che sono in genere ancorati, ma che hanno una o più parti/modelli figli che i giocatori possono trascinare. Ad esempio, il seguente scrivania ha due cassetti che i giocatori possono aprire per ispezionare cosa c'è dentro.
Trascina i sensori e le limitazioni
Puoi combinare i sensori di trascinamento con Constraints , ad esempio una marionetta. Nel seguente setup, le maniglie di controllo sono ancorate, le parti del corpo non sono ancorate e le restrizioni tengono la marionetta insieme. La spostamento delle maniglie con il TranslateViewPlane
Interfaccie utente 3D
Le interfacce utente 3D sono facilmente ottenibili tramite i rilevatori di trascinamento, come l'aggiustamento della luce di un SpotLight basato su un
DragDetector - Interfaccia utente 3D
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
-- Aggiustare la dimensione e la velocità delle particelle in base al fattore X del rilevatore di trascinamento
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)
-- Abbina il colore delle particelle in base al fattore Z del detector di trascinamento
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)