L'istanza UIDragDetector facilita e incoraggia l'interazione con gli elementi dell'interfaccia utente 2D in un gioco, come cursori, spinner e altro. Le caratteristiche principali includono:
Posizionare un UIDragDetector sotto qualsiasi istanza di GuiObject per renderlo trascinabile tramite tutti gli input dell'utente senza una singola riga di codice.
Scegliere tra diverse opzioni di DragStyle, definire come l'oggetto risponde al movimento tramite ResponseStyle, e applicare facoltativamente assi, limiti di movimento o confini di trascinamento.
Gli script possono rispondere alla manipolazione degli oggetti trascinati per guidare risposte logiche, come l'aggiustamento delle impostazioni.
I UIDragDetectors funzionano in modalità modifica e riproduzione di Studio finché non si utilizza gli strumenti Seleziona, Sposta, Scala o Ruota, né determinati plugin o strumenti dell'editor UI di Studio.
Rendere gli elementi UI trascinabili
Per rendere qualsiasi istanza di GuiObject trascinabile, basta aggiungere un UIDragDetector come discendente diretto.
Dal menu, inserisci un UIDragDetector.

Per impostazione predefinita, l'oggetto sarà ora trascinabile nell'interfaccia di LayerCollector.
Personalizzare i rilevatori di trascinamento UI
Stile di trascinamento
I UIDragDetectors mappano il movimento del cursore per calcolare il movimento 2D proposto e/o la rotazione. Tramite la proprietà DragStyle, puoi scegliere tra diverse mappature per soddisfare le tue esigenze. Ad esempio, Enum.UIDragDetectorDragStyle.TranslatePlane produce una traduzione nel piano 2D del LayerCollector, mentre Enum.UIDragDetectorDragStyle.Rotate produce normalmente una rotazione invece di una traduzione.
| Impostazione | Descrizione |
|---|---|
| TranslateLine | Movimento 1D lungo l'asse di trascinamento DragAxis del rilevatore. |
| TranslatePlane | Movimento 2D nel piano del LayerCollector. |
| Rotate | Per impostazione predefinita, rotazione attorno alla posizione centrale assoluta dell'oggetto padre del rilevatore GuiObject. Se ReferenceUIInstance è impostato, la rotazione avviene attorno alla posizione centrale assoluta di quell'istanza. |
| Scriptable | Calcola il movimento desiderato tramite una funzione personalizzata fornita tramite SetDragStyleFunction(). |
Direzione di trascinamento
Per impostazione predefinita, il movimento 2D e il relativo DragStyle si mappano nello spazio dell'antenato LayerCollector. Tuttavia, potresti voler cambiare il ReferenceUIInstance o il DragAxis quando costruisci diversi componenti UI.
| Impostazione | Descrizione | Predefinito |
|---|---|---|
| ReferenceUIInstance | Un'istanza di GuiObject il cui spazio locale e posizione centrale assoluta è lo spazio di riferimento e l'origine per il rilevatore. Impostare questo riferimento influisce su proprietà come DragUDim2, DragRotation, e il comportamento di DragAxis. | nil |
| DragAxis | Valore Vector2 che definisce l'asse di movimento per l'oggetto trascinato quando DragStyle è impostato su Enum.UIDragDetectorDragStyle.TranslateLine. L'asse è definito nello spazio locale del UIDragDetector a meno che non sia definito ReferenceUIInstance, nel qual caso l'asse è definito nello spazio locale di quell'istanza. | (1, 0) |
Risposta al movimento
La proprietà UIDragDetector.ResponseStyle specifica come il valore di posizione di un oggetto viene modificato dal movimento proposto. Gli stili di risposta personalizzati ti consentono di utilizzare i valori risultanti di UIDragDetector.DragUDim2 e UIDragDetector.DragRotation come desideri, senza che il genitore del rilevatore esegua il movimento proposto.
| Impostazione | Descrizione |
|---|---|
| Offset | Muovi in base ai valori Offset della posizione del genitore del rilevatore GuiObject.Position. Questa è l'impostazione predefinita. |
| Scale | Muovi in base ai valori Scale della posizione del genitore del rilevatore GuiObject.Position. |
| CustomOffset | L'elemento UI non si muoverà affatto, ma i valori Offset del DragUDim2 del rilevatore verranno comunque aggiornati e gli eventi del rilevatore verranno comunque attivati, consentendoti di rispondere alla manipolazione del trascinamento come desideri. |
| CustomScale | L'elemento UI non si muoverà affatto, ma i valori Scale del DragUDim2 del rilevatore verranno comunque aggiornati e gli eventi del rilevatore verranno comunque attivati, consentendoti di rispondere alla manipolazione del trascinamento come desideri. |
Limiti di traduzione e rotazione
Per impostazione predefinita, non ci sono limiti al movimento 2D oltre le restrizioni intrinseche dello DragStyle. I limiti per le traduzioni e le rotazioni minime e massime possono essere dichiarati con le seguenti proprietà se desiderato. Inoltre, puoi definire come l'oggetto trascinato è vincolato all'interno dei confini di un GuiObject specificato come un Frame.
| Proprietà | Descrizione | Predefinito |
|---|---|---|
| MinDragTranslation MaxDragTranslation | Limiti alla traduzione di trascinamento in ciascuna dimensione, definiti da un valore UDim2. Se MaxDragTranslation è maggiore di MinDragTranslation, la traduzione sarà limitata all'interno di quel range. | {0, 0}, {0, 0} |
| MinDragAngle MaxDragAngle | Rilevante solo se DragStyle è impostato su Enum.UIDragDetectorDragStyle.Rotate, o se le funzioni impostate tramite SetDragStyleFunction() o AddConstraintFunction() definiscono un valore di rotazione. Se MaxDragAngle è maggiore di MinDragAngle, la rotazione sarà limitata all'interno di quel range. | 0 |
| BoundingBehavior | Determina il comportamento di delimitazione dell'istanza UIDragDetector quando il suo BoundingUI è impostato. Impostare questo su EntireObject delimita l'intero UI trascinato all'interno del BoundingUI, mentre impostarlo su HitPoint delimita l'UI trascinato solo dal punto di colpo/afferrare esatto e dalla sua posizione rispettiva dopo traduzione/rotazione. Come comodità, il predefinito di Automatic imita il comportamento di EntireObject per un oggetto UI completamente contenuto dal BoundingUI, oppure HitPoint per un oggetto UI parzialmente al di fuori del BoundingUI. | Automatic |
Regolazioni della velocità
Attraverso SelectionModeDragSpeed e SelectionModeRotateSpeed, puoi affinare le velocità massime di trascinamento/rotazione per un rilevatore. Inoltre, tramite UIDragSpeedAxisMapping, puoi affinare le velocità di trascinamento nelle dimensioni X/Y, basate sulla SelectionModeDragSpeed del rilevatore.
| Proprietà | Descrizione |
|---|---|
| SelectionModeDragSpeed | Definisce la velocità massima di trascinamento per la traduzione come una combinazione di Scale e Offset del primo antenato ScreenGui o SurfaceGui a cui appartiene il UIDragDetector. |
| SelectionModeRotateSpeed | Definisce l'angolo massimo al secondo a cui il UIDragDetector può ruotare. |
| UIDragSpeedAxisMapping | Determina le velocità di trascinamento nelle dimensioni X/Y, basate sulla SelectionModeDragSpeed del rilevatore. Il predefinito è XY, il che significa che le velocità degli assi X e Y si basano sui valori X e Y Scale/Offset rispettivamente. Le alternative sono XX e YY, il che significa che le velocità degli assi X e Y si basano rispettivamente sull'asse X (XX) o sull'asse Y (YY) per Scale, mentre i valori Offset si applicano ancora ai rispettivi assi. Ad esempio, se il primo antenato ScreenGui è dimensionato 800×600 e SelectionModeDragSpeed è {0.1, 10}, {0.1, 20}, un'impostazione di XX risulta in una velocità di trascinamento X/Y di 80+10/80+20, mentre YY risulta in 60+10/60+20 (nota che i valori Offset rimangono gli stessi in entrambi i casi). |
Risposte degli script ai clic e al trascinamento
Attraverso segnali di eventi, modifiche di proprietà, stile di trascinamento Scriptable, e funzioni personalizzate, gli script possono rispondere alla manipolazione degli elementi UI trascinati per guidare varie impostazioni o prendere decisioni logiche, come cursori che regolano separatamente il volume della musica e degli effetti sonori.
Segnali di eventi
Attraverso i seguenti segnali di eventi, puoi rilevare quando un utente inizia, continua e termina di trascinare 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 è stato avviato DragStart. |
| DragEnd | Si attiva quando un utente smette di trascinare l'oggetto. |
Il seguente cursore designa il suo contenitore come BoundingUI per limitare il suo movimento all'interno dell'area del contenitore, consentendo al trascinamento basato sulla scala TranslateLine di essere limitato all'intera larghezza del contenitore senza scripting aggiuntivo.
-- Gerarchia è SliderContainer ⟩ Handle ⟩ UIDragDetector ⟩ (questo script)
local sliderContainer = script.Parent.Parent.Parent
local handle = sliderContainer:FindFirstChild("Handle")
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- Imposta il trascinamento per scala
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.TranslateLine -- Limita il trascinamento a una linea
uiDragDetector.BoundingUI = sliderContainer
-- Imposta inizialmente la trasparenza del contenitore al valore di scala X della maniglia
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
-- Espandi il bordo della maniglia per indicare l'inizio della presa
uiDragDetector.DragStart:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 6
end)
-- Cambia la trasparenza in base a quanto è stato trascinato in scala
uiDragDetector.DragContinue:Connect(function(inputPosition)
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
end)
-- Ripristina il bordo della maniglia per indicare la fine della presa
uiDragDetector.DragEnd:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 4
end)Cambiamenti di posizione e rotazione
In aggiunta ai segnali di eventi, puoi monitorare i cambiamenti alle proprietà DragUDim2 e/o DragRotation del rilevatore direttamente.
Il seguente rilevatore ha il suo DragStyle impostato su Rotate, consentendo agli utenti di trascinare la maniglia attorno all'anello rotante dell'hue, tutto mentre si rilevano i cambiamenti alla rotazione di trascinamento tramite Instance:GetPropertyChangedSignal().
local handle = script.Parent.Parent -- Elemento UI da trascinare
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.Rotate -- Imposta lo stile di trascinamento su ruotare
local function changeHue()
local currAngle = (math.fmod(handle.Rotation, 360)) / 360
if currAngle < 0 then
currAngle += 1
end
handle.BackgroundColor3 = Color3.fromHSV(currAngle, 1, 1)
end
-- Imposta inizialmente il colore dell'hue alla rotazione della maniglia
changeHue()
-- Collega la funzione a GetPropertyChangedSignal() della rotazione di trascinamento del rilevatore
uiDragDetector:GetPropertyChangedSignal("DragRotation"):Connect(changeHue)Stile di trascinamento scriptato
Se imposti lo UIDragDetector.DragStyle di un rilevatore su Enum.UIDragDetectorDragStyle.Scriptable, puoi fornire la tua funzione che accetta un Vector2 della posizione di input e restituisce un UDim2 (posizione) e un float (rotazione). Il rilevatore aggiornerà l'oggetto alla posizione/rotazione calcolata in base ai ritorni, alla proprietà DragSpace, e alla proprietà DragRelativity.
Per impostazione predefinita, il UDim2 e il float restituiti saranno la posizione/rotazione finale desiderata nello spazio locale del genitore del rilevatore. I limiti di traduzione/rotazione esistenti si applicheranno ancora, così come i limiti di confine imposti da un'istanza specificata di BoundingUI.
Il seguente esempio trascina un elemento UI seguendo un'onda sinusoidale calcolata dal cambiamento nella coordinata X di input. Nota che lo DragSpace del rilevatore è impostato su Enum.UIDragDetectorDragSpace.Relative.
local frame = script.Parent -- Elemento UI da trascinare
local uiDragDetector = frame:FindFirstChildWhichIsA("UIDragDetector")
local initialXValue = 0
local maxHeightChange = 200
local pixelsPerRadian = 75 -- Abbassa questo valore per aumentare la frequenza
uiDragDetector.DragStart:Connect(function(inputPosition)
initialXValue = inputPosition.X
end)
local function computeSinWaveCoordinate(inputPosition)
local deltaX = inputPosition.X - initialXValue
-- Delta Y negativo in modo che vada "su" sullo schermo con un cambiamento positivo di Y
local deltaY = -math.sin(deltaX / pixelsPerRadian) * maxHeightChange
return UDim2.fromOffset(deltaX, deltaY)
end
uiDragDetector:SetDragStyleFunction(computeSinWaveCoordinate)Funzione di vincolo personalizzata
I UIDragDetectors non hanno regole di movimento integrate riguardo a griglie e scatti, ma puoi registrare funzioni di vincolo personalizzate per modificare il UIDragDetector.DragUDim2 e il UIDragDetector.DragRotation del rilevatore prima che vengano applicati. Ad esempio, puoi mantenere il movimento su una griglia arrotondando le posizioni a incrementi specifici, o definire aree di movimento consentite. Nota che questo viene applicato prima di eventuali limiti di traduzione/rotazione esistenti.
Il seguente esempio utilizza una funzione di vincolo che limita il trascinamento planare in una griglia X/Y basata sul numero di righe e colonne. Nota che lo ResponseStyle del rilevatore è impostato su Enum.UIDragDetectorResponseStyle.Scale e il suo BoundingUI è impostato sul contenitore della griglia.
-- Gerarchia è GridContainer ⟩ Handle ⟩ UIDragDetector ⟩ (questo script)
local gridContainer = script.Parent.Parent.Parent
local handle = gridContainer:FindFirstChild("Handle") -- Elemento UI da trascinare
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- Imposta il trascinamento per scala
uiDragDetector.DragRelativity = Enum.UIDragDetectorDragRelativity.Relative
uiDragDetector.BoundingUI = gridContainer
local NUM_COLUMNS = 10
local NUM_ROWS = 5
local xScaleIncrement = 1 / NUM_COLUMNS
local yScaleIncrement = 1 / NUM_ROWS
local initialParentPosition = uiDragDetector.Parent.Position
uiDragDetector.DragStart:Connect(function()
initialParentPosition = uiDragDetector.Parent.Position
end)
local function dragToGridOnly(proposedPosition, proposedRotation)
local griddedXScale = math.round(proposedPosition.X.Scale / xScaleIncrement) * xScaleIncrement
local griddedYScale = math.round(proposedPosition.Y.Scale / yScaleIncrement) * yScaleIncrement
return UDim2.fromScale(griddedXScale, griddedYScale), proposedRotation
end
uiDragDetector:AddConstraintFunction(1, dragToGridOnly)