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

  1. Nella finestra Explorer, passa il mouse sopra l'istanza di GuiObject e fai clic 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.

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.

ImpostazioneDescrizione
TranslateLineMovimento 1D lungo l'asse di trascinamento DragAxis del rilevatore.
TranslatePlaneMovimento 2D nel piano del LayerCollector.
RotatePer 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.
ScriptableCalcola 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.

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

ImpostazioneDescrizione
OffsetMuovi in base ai valori Offset della posizione del genitore del rilevatore GuiObject.Position. Questa è l'impostazione predefinita.
ScaleMuovi in base ai valori Scale della posizione del genitore del rilevatore GuiObject.Position.
CustomOffsetL'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.
CustomScaleL'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àDescrizionePredefinito
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
BoundingBehaviorDetermina 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
SelectionModeDragSpeedDefinisce 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.
SelectionModeRotateSpeedDefinisce l'angolo massimo al secondo a cui il UIDragDetector può ruotare.
UIDragSpeedAxisMappingDetermina 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.

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

UIDragDetector - Cambiamento di Trasparenza Segnale Evento
-- 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().

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

UIDragDetector - Trascinamento Seguendo un'Onda Sinusoidale
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.

UIDragDetector - Trascinamento in Griglia, Scattando ai Riquadri
-- 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.