L'instance UIDragDetector facilite et encourage l'interaction avec les éléments de l'interface utilisateur 2D dans une expérience, tels que les curseurs, les molettes, et plus encore. Les principales fonctionnalités incluent :
Placez un UIDragDetector sous n'importe quelle instance de GuiObject pour le rendre déplaçable via toutes les entrées utilisateur sans une seule ligne de code.
Choisissez parmi plusieurs options de DragStyle, définissez comment l'objet réagit au mouvement via ResponseStyle, et appliquez éventuellement des axes, des limites de mouvement ou des frontières de glissement.
Les scripts peuvent réagir à la manipulation des objets déplacés pour conduire des réponses logiques, comme ajuster des paramètres.
Les UIDragDetectors fonctionnent en mode édition et de lecture dans Studio tant que vous n'utilisez pas les outils Sélectionner, Déplacer, Échelle ou Rotation, ni certains plugins ou outils d'édition d'UI de Studio.
Rendre les éléments de l'UI déplaçables
Pour rendre n'importe quelle instance de GuiObject déplaçable, ajoutez simplement un UIDragDetector comme descendant direct.
Dans la fenêtre Explorateur, survolez l'instance GuiObject et cliquez sur le bouton ⊕. Un menu contextuel s'affiche.
Dans le menu, insérez un UIDragDetector.

Par défaut, l'objet sera maintenant déplaçable dans l'interface LayerCollector.
Personnaliser les détecteurs de glisser de l'UI
Style de glissement
Les UIDragDetectors mappent le mouvement du curseur pour calculer le mouvement 2D proposé et/ou la rotation. Grâce à la propriété DragStyle, vous pouvez choisir parmi différents mappages pour convenir à vos besoins. Par exemple, Enum.UIDragDetectorDragStyle.TranslatePlane produit une translation dans le plan 2D du LayerCollector, tandis que Enum.UIDragDetectorDragStyle.Rotate produit normalement une rotation au lieu d'une translation.
| Paramètre | Description |
|---|---|
| TranslateLine | Mouvement 1D le long de l'DragAxis du détecteur. |
| TranslatePlane | Mouvement 2D dans le plan du LayerCollector. |
| Rotate | Par défaut, rotation autour de la position centrale absolue du parent GuiObject du détecteur. Si ReferenceUIInstance est défini, la rotation s'effectue autour de la position centrale absolue de cette instance. |
| Scriptable | Calcule le mouvement souhaité via une fonction personnalisée fournie par SetDragStyleFunction(). |
Direction de glissement
Par défaut, le mouvement 2D et le DragStyle associé se mappent à l'espace de l'ancêtre LayerCollector. Toutefois, vous pouvez vouloir changer le ReferenceUIInstance ou l'DragAxis lors de la construction de différents composants de l'UI.
| Paramètre | Description | Par défaut |
|---|---|---|
| ReferenceUIInstance | Une instance de GuiObject dont l'espace local et la position centrale absolue constituent l'espace de référence et l'origine pour le détecteur. Définir cette référence affecte des propriétés telles que DragUDim2, DragRotation, et le comportement de DragAxis. | nil |
| DragAxis | Valeur Vector2 qui définit l'axe de mouvement pour l'objet déplacé lorsque DragStyle est défini sur Enum.UIDragDetectorDragStyle.TranslateLine. L'axe est défini dans l'espace local du UIDragDetector à moins que ReferenceUIInstance ne soit défini, auquel cas l'axe est défini dans l'espace local de cette instance. | (1, 0) |
Réponse au mouvement
La propriété UIDragDetector.ResponseStyle spécifie comment la valeur de position d'un objet est modifiée par le mouvement proposé. Les styles de réponse personnalisés vous permettent d'utiliser les valeurs résultantes UIDragDetector.DragUDim2 et UIDragDetector.DragRotation comme désiré, sans que le parent du détecteur n'exécute le mouvement proposé.
| Paramètre | Description |
|---|---|
| Offset | Déplace par les valeurs Offset de la valeur GuiObject.Position du parent du détecteur. C'est le paramètre par défaut. |
| Scale | Déplace par les valeurs Scale de la valeur GuiObject.Position du parent du détecteur. |
| CustomOffset | L'élément UI ne se déplacera pas du tout, mais les valeurs Offset du DragUDim2 du détecteur seront tout de même mises à jour et les événements du détecteur se déclencheront toujours, vous permettant de répondre à la manipulation du glissement comme vous le souhaitez. |
| CustomScale | L'élément UI ne se déplacera pas du tout, mais les valeurs Scale du DragUDim2 du détecteur seront tout de même mises à jour et les événements du détecteur se déclencheront toujours, vous permettant de répondre à la manipulation du glissement comme vous le souhaitez. |
Limites de translation & rotation
Par défaut, il n'y a pas de limites lors du mouvement 2D en raison des restrictions inhérentes du DragStyle. Les limites pour les translations et rotations minimales et maximales peuvent être déclarées avec les propriétés suivantes si désiré. De plus, vous pouvez définir comment l'objet déplacé est contraint dans les limites d'un GuiObject spécifié tel qu'un Frame.
| Propriétés | Description | Par défaut |
|---|---|---|
| MinDragTranslation MaxDragTranslation | Limites de translation de glissement dans chaque dimension, définies par une valeur UDim2. Si MaxDragTranslation est supérieur à MinDragTranslation, la translation sera limitée dans cette plage. | {0, 0}, {0, 0} |
| MinDragAngle MaxDragAngle | Relevée uniquement si DragStyle est défini sur Enum.UIDragDetectorDragStyle.Rotate, ou si les fonctions définies par SetDragStyleFunction() ou AddConstraintFunction() définissent une valeur de rotation. Si MaxDragAngle est supérieur à MinDragAngle, la rotation sera limitée dans cette plage. | 0 |
| BoundingBehavior | Détermine le comportement de délimitation de l'instance UIDragDetector lorsque son BoundingUI est défini. Le définir à EntireObject borne l'ensemble de l'UI déplacée à l'intérieur du BoundingUI, tandis que le définir sur HitPoint borne l'UI déplacée uniquement par le point d'impact/prise et sa position respective après translation/rotation. Par convenience, le paramètre par défaut Automatic imite le comportement de EntireObject pour un objet UI totalement contenu par le BoundingUI, ou bien HitPoint pour un objet UI partiellement en dehors du BoundingUI. | Automatic |
Ajustements de vitesse
À travers SelectionModeDragSpeed et SelectionModeRotateSpeed, vous pouvez peaufiner les vitesses maximales de glissement/rotation pour un détecteur. De plus, à travers UIDragSpeedAxisMapping, vous pouvez peaufiner les vitesses de glissement dans la dimension X/Y, basées sur le SelectionModeDragSpeed du détecteur.
| Propriété | Description |
|---|---|
| SelectionModeDragSpeed | Définit la vitesse maximale de glissement pour la translation comme une combinaison des valeurs Scale et Offset du premier ancêtre ScreenGui ou SurfaceGui auquel appartient le UIDragDetector. |
| SelectionModeRotateSpeed | Définit l'angle maximal par seconde auquel le UIDragDetector peut tourner. |
| UIDragSpeedAxisMapping | Détermine les vitesses de glissement dans la dimension X/Y, basées sur le SelectionModeDragSpeed du détecteur. La valeur par défaut est XY, ce qui signifie que les vitesses des axes X et Y sont basées sur les valeurs Scale/Offset respectives. Les alternatives sont XX et YY, ce qui signifie que les vitesses des axes X et Y sont basées sur l'axe X (XX) ou l'axe Y (YY) pour Scale, tandis que les valeurs Offset s'appliquent toujours à leurs axes respectifs. Par exemple, si le premier ancêtre ScreenGui est dimensionné 800×600 et que SelectionModeDragSpeed est {0.1, 10}, {0.1, 20}, un paramètre de XX résulte en une vitesse de glissement X/Y de 80+10/80+20, tandis que YY résulte en 60+10/60+20 (notez que les valeurs Offset restent les mêmes dans les deux cas). |
Réponses des scripts au clic et au glissement
À travers les signaux d'événements, les changements de propriétés, le style de glissement Scriptable, et des fonctions personnalisées, les scripts peuvent réagir à la manipulation des éléments UI déplacés pour conduire divers paramètres ou prendre des décisions logiques, tels que des curseurs qui ajustent le volume de musique et d'effets sonores séparément.
Signaux d'événements
À travers les signaux d'événements suivants, vous pouvez détecter quand un utilisateur commence, continue et termine de glisser un objet.
| Événement | Description |
|---|---|
| DragStart | Se déclenche lorsque l'utilisateur commence à glisser l'objet. |
| DragContinue | Se déclenche lorsque l'utilisateur continue à glisser l'objet après que DragStart a été initié. |
| DragEnd | Se déclenche lorsque l'utilisateur arrête de glisser l'objet. |
Le curseur suivant désigne son conteneur comme étant le BoundingUI pour limiter son mouvement à l'intérieur de la zone du conteneur, permettant au glissement basé sur l'échelle TranslateLine d’être limité à la pleine largeur du conteneur sans scripts supplémentaires.
UIDragDetector - Changement de transparence du signal d'événement
-- La hiérarchie est SliderContainer ⟩ Handle ⟩ UIDragDetector ⟩ (ce script)
local sliderContainer = script.Parent.Parent.Parent
local handle = sliderContainer:FindFirstChild("Handle")
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- Définir le glissement par échelle
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.TranslateLine -- Restreint le glissement à une ligne
uiDragDetector.BoundingUI = sliderContainer
-- Définir initialement la transparence du conteneur à la valeur d'échelle X de la poignée
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
-- Agrandir la bordure de la poignée pour indiquer le début de la prise
uiDragDetector.DragStart:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 6
end)
-- Changer la transparence selon le glissement dans l'échelle
uiDragDetector.DragContinue:Connect(function(inputPosition)
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
end)
-- Rétrograder la bordure de la poignée pour indiquer la fin de la prise
uiDragDetector.DragEnd:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 4
end)
Changements de position & rotation
En plus des signaux d'événements, vous pouvez surveiller les changements des propriétés DragUDim2 et/ou DragRotation du détecteur directement.
Le détecteur suivant a son DragStyle défini sur Rotate, permettant aux utilisateurs de faire glisser la poignée autour de l'anneau de rotation de teinte, tout en détectant les changements de rotation du glissement via Instance:GetPropertyChangedSignal().
UIDragDetector - Changement de DragRotation
local handle = script.Parent.Parent -- Élément UI à glisser
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.Rotate -- Définir le style de glissement sur rotation
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
-- Définir initialement la teinte selon la rotation de la poignée
changeHue()
-- Connecter la fonction à GetPropertyChangedSignal() de la rotation de glissement du détecteur
uiDragDetector:GetPropertyChangedSignal("DragRotation"):Connect(changeHue)
Style de glissement scripté
Si vous définissez le UIDragDetector.DragStyle d'un détecteur sur Enum.UIDragDetectorDragStyle.Scriptable, vous pouvez fournir votre propre fonction qui prend en entrée un Vector2 de la position d'entrée et renvoie un UDim2 (position) et un float (rotation). Le détecteur mettra à jour l'objet à la position/rotation calculée en fonction des retours, de la propriété DragSpace, et de la propriété DragRelativity.
Par défaut, les valeurs retournées UDim2 et float seront la position/rotation finale souhaitée dans l'espace local du parent du détecteur. Les limites de translation/rotation existantes s'appliqueront toujours, tout comme les limites imposées par une instance BoundingUI spécifiée.
L'exemple suivant fait glisser un élément UI en suivant une onde sinusoïdale calculée par le changement de coordonnée X de l'entrée. Notez que l'espace de glissement du détecteur DragSpace est défini sur Enum.UIDragDetectorDragSpace.Relative.
UIDragDetector - Drag suivant une onde sinusoïdale
local frame = script.Parent -- Élément UI à glisser
local uiDragDetector = frame:FindFirstChildWhichIsA("UIDragDetector")
local initialXValue = 0
local maxHeightChange = 200
local pixelsPerRadian = 75 -- Diminuez cette valeur pour augmenter la fréquence
uiDragDetector.DragStart:Connect(function(inputPosition)
initialXValue = inputPosition.X
end)
local function computeSinWaveCoordinate(inputPosition)
local deltaX = inputPosition.X - initialXValue
-- Delta Y négatif afin qu'il monte à l'écran avec un changement positif en Y
local deltaY = -math.sin(deltaX / pixelsPerRadian) * maxHeightChange
return UDim2.fromOffset(deltaX, deltaY)
end
uiDragDetector:SetDragStyleFunction(computeSinWaveCoordinate)
Fonction contraignante personnalisée
Les UIDragDetectors n'ont pas de règles de mouvement intégrées concernant les grilles et les alignements, mais vous pouvez enregistrer des fonctions contraignantes personnalisées pour modifier les UIDragDetector.DragUDim2 et UIDragDetector.DragRotation du détecteur avant qu'elles ne soient appliquées. Par exemple, vous pouvez maintenir le mouvement sur une grille en arrondissant les positions à des incréments spécifiques, ou définir des zones de mouvement autorisées. Notez que cela est appliqué avant toute limite de translation/rotation existante.
L'exemple suivant utilise une fonction de contrainte qui limite le glissement plan à une grille X/Y basée sur le nombre de lignes et de colonnes. Notez que le style de réponse du détecteur ResponseStyle est défini sur Enum.UIDragDetectorResponseStyle.Scale et son BoundingUI est défini sur le conteneur de grille.
UIDragDetector - Glisser dans la grille, accrochant à des tuiles
-- La hiérarchie est GridContainer ⟩ Handle ⟩ UIDragDetector ⟩ (ce script)
local gridContainer = script.Parent.Parent.Parent
local handle = gridContainer:FindFirstChild("Handle") -- Élément UI à glisser
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- Définir le glissement par échelle
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)