Rilevatori di trascinamento UI

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

L'istanza UIDragDetector facilita e incoraggia l'interazione con elementi dell'interfaccia utente 2D in un'esperienza, come cursori, giranti e altro ancora. 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 nella modalità di modifica e riproduzione di Studio purché tu non stia utilizzando gli strumenti Seleziona, Muovi, Scala o Ruota, né determinati plugin o strumenti dell'editor UI di Studio.

Rendi gli elementi UI trascinabili

Per rendere qualsiasi istanza di GuiObject trascinabile, basta aggiungere un UIDragDetector come discendente diretto.

  1. Nella finestra Explorer, passa sopra l'istanza di GuiObject e clicca sul pulsante ⊕. Viene visualizzato un menu contestuale.

  2. Dal menu, inserisci un UIDragDetector.

  3. Per impostazione predefinita, l'oggetto sarà ora trascinabile nell'interfaccia di LayerCollector.

Personalizza 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 normalmente produce una rotazione invece di una traduzione.

ImpostazioneDescrizione
TranslateLineMovimento 1D lungo l'asse di trascinamento del rilevatore DragAxis.
TranslatePlaneMovimento 2D nel piano del LayerCollector.
RotatePer impostazione predefinita, rotazione attorno alla posizione centrale assoluta dell'oggetto genitore del rilevatore GuiObject. Se ReferenceUIInstance è impostato, la rotazione avviene attorno alla posizione centrale assoluta di quell'istanza.
ScriptableCalcola il movimento desiderato tramite una funzione personalizzata fornita tramite SetDragStyleFunction().

Direzione di trascinamento

Per impostazione predefinita, il movimento 2D e il relativo DragStyle mappano allo spazio del genitore LayerCollector. Tuttavia, potresti voler cambiare il ReferenceUIInstance o il DragAxis quando crei diversi componenti UI.

ImpostazioneDescrizionePredefinito
ReferenceUIInstanceUn'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
DragAxisValore di 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 ReferenceUIInstance non sia definito, nel qual caso l'asse è definito nello spazio locale di quell'istanza.(1, 0)

Risposta al movimento

La proprietà UIDragDetector.ResponseStyle specifica come viene modificato il valore di posizione di un oggetto dal movimento proposto. Gli stili di risposta personalizzati ti consentono di utilizzare i valori risultanti UIDragDetector.DragUDim2 e UIDragDetector.DragRotation come desideri, senza che il genitore del rilevatore esegua il movimento proposto.

ImpostazioneDescrizione
OffsetMuovi in base ai valori di Offset della posizione del genitore del rilevatore GuiObject. Questa è l'impostazione predefinita.
ScaleMuovi in base ai valori di Scale della posizione del genitore del rilevatore GuiObject.
CustomOffsetL'elemento UI non si muoverà affatto, ma i valori di Offset del DragUDim2 del rilevatore verranno comunque aggiornati e gli eventi del rilevatore verranno comunque attivati, consentendoti di rispondere alla manipolazione del trascinamento come preferisci.
CustomScaleL'elemento UI non si muoverà affatto, ma i valori di Scale del DragUDim2 del rilevatore verranno comunque aggiornati e gli eventi del rilevatore verranno comunque attivati, consentendoti di rispondere alla manipolazione del trascinamento come preferisci.

Limiti di traduzione e rotazione

Per impostazione predefinita, non ci sono limiti al movimento 2D oltre le restrizioni inerenti dello DragStyle. I limiti sia per le traduzioni che per 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 determinato GuiObject, come un Frame.

ProprietàDescrizionePredefinito
MinDragTranslation
MaxDragTranslation
Limiti alla traduzione di trascinamento in ciascuna dimensione, definiti da un valore di 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
BoundingBehaviorDetermina il comportamento di delimitazione dell'istanza UIDragDetector quando il suo BoundingUI è impostato. Impostandolo su EntireObject, delimita l'intera UI trascinata all'interno del BoundingUI, mentre impostandolo su HitPoint delimita la UI trascinata solo dal punto di colpo/afferrazione esatto e dalla sua rispettiva posizione dopo traduzione/rotazione. Come convenienza, il predefinito di Automatic mimica il comportamento di EntireObject per un oggetto UI interamente contenuto dal BoundingUI, altrimenti HitPoint per un oggetto UI che è parzialmente al di fuori del BoundingUI.Automatic

Regolazioni della velocità

Attraverso SelectionModeDragSpeed e SelectionModeRotateSpeed, puoi regolare le velocità massime di trascinamento/rotazione per un rilevatore. Inoltre, tramite UIDragSpeedAxisMapping, puoi affinare le velocità di trascinamento nelle dimensioni X/Y, in base alla SelectionModeDragSpeed del rilevatore.

ProprietàDescrizione
SelectionModeDragSpeedDefinisce la velocità massima di trascinamento per la traduzione come una combinazione di Scale e Offset del primo genitore ScreenGui o SurfaceGui a cui appartiene il UIDragDetector.
SelectionModeRotateSpeedDefinisce l'angolo massimo al secondo a cui il UIDragDetector può ruotare.
UIDragSpeedAxisMappingDetermina le velocità di trascinamento nelle dimensioni X/Y, in base alla SelectionModeDragSpeed del rilevatore. Il predefinito è XY, il che significa che le velocità degli assi X e Y sono basate sui valori X e Y di Scale/Offset rispettivamente.

Le alternative sono XX e YY, il che significa che sia le velocità degli assi X che Y sono basate sull'asse X (XX) o sull'asse Y (YY) per Scale, mentre i valori di Offset si applicano ancora ai rispettivi assi. Ad esempio, se il primo genitore ScreenGui è dimensionato 800×600 e SelectionModeDragSpeed è {0.1, 10}, {0.1, 20}, un'impostazione di XX risulterebbe in una velocità di trascinamento X/Y di 80+10/80+20, mentre YY risulterebbe in 60+10/60+20 (nota che i valori di Offset rimangono gli stessi in entrambi i casi).

Risposte degli script ai clic e al trascinamento

Attraverso segni di evento, cambiamenti 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.

Segni di evento

Attraverso i seguenti segni di evento, puoi rilevare quando un utente inizia, continua e termina il trascinamento di un oggetto.

EventoDescrizione
DragStartSi attiva quando un utente inizia a trascinare l'oggetto.
DragContinueSi attiva quando un utente continua a trascinare l'oggetto dopo che è stato avviato DragStart.
DragEndSi attiva quando un utente smette di trascinare l'oggetto.

Il seguente cursore designa il suo contenitore come il 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 ulteriore scripting.

UIDragDetector - Cambiamento di Trasparenza da Segnale Evento

-- La 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 linee
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)
-- Riporta 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

Oltre ai segni di evento, puoi monitorare i cambiamenti delle 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 del rotatore di tonalità, tutto mentre si rilevano i cambiamenti alla rotazione di trascinamento tramite Instance:GetPropertyChangedSignal().

UIDragDetector - Cambiamento di DragRotation

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 ruota
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 della tonalità alla rotazione della maniglia
changeHue()
-- Collega la funzione a GetPropertyChangedSignal() della rotazione di trascinamento del rilevatore
uiDragDetector:GetPropertyChangedSignal("DragRotation"):Connect(changeHue)

Stile di trascinamento personalizzato

Se imposti il 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 numero in virgola mobile (rotazione). Il rilevatore aggiornerà l'oggetto alla posizione/rotazione calcolata basata sui ritorni, sulla proprietà DragSpace, e sulla proprietà DragRelativity.

Per impostazione predefinita, i UDim2 e i numeri in virgola mobile restituiti saranno la posizione/rotazione finale desiderata nello spazio locale del genitore del rilevatore. I limiti di traduzione/rotazione esistenti continueranno ad applicarsi, 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 il DragSpace del rilevatore è impostato su Enum.UIDragDetectorDragSpace.Relative.

UIDragDetector - Trascinamento Seguendo Onda Sinusoidale

local frame = script.Parent -- Elemento UI da trascinare
local uiDragDetector = frame:FindFirstChildWhichIsA("UIDragDetector")
local initialXValue = 0
local maxHeightChange = 200
local pixelsPerRadian = 75 -- Riduci questo valore per aumentare la frequenza
uiDragDetector.DragStart:Connect(function(inputPosition)
initialXValue = inputPosition.X
end)
local function computeSinWaveCoordinate(inputPosition)
local deltaX = inputPosition.X - initialXValue
-- Negative Y delta in modo che vada "su" sullo schermo con cambiamento Y positivo
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 riguardanti griglie e aggancio, ma puoi registrare funzioni di vincolo personalizzate per modificare il UIDragDetector.DragUDim2 e UIDragDetector.DragRotation del rilevatore prima che vengano applicate. 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 a una griglia X/Y in base al numero di righe e colonne. Nota che la proprietà ResponseStyle del rilevatore è impostata su Enum.UIDragDetectorResponseStyle.Scale e la sua proprietà BoundingUI è impostata sul contenitore della griglia.

UIDragDetector - Traslazione nella Griglia, Agganciando ai Riquadri

-- La 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)
© 2026 Roblox Corporation. Roblox, il logo Roblox e Powering Imagination sono tra i nostri marchi registrati e non registrati negli Stati Uniti. e altri paesi.