A instância UIDragDetector facilita e incentiva a interação com elementos de interface do usuário 2D em um jogo, como deslizadores, giradores e mais. As principais características incluem:
Coloque um UIDragDetector sob qualquer instância de GuiObject para torná-lo arrastável via todas as entradas do usuário sem uma única linha de código.
Escolha entre várias opções de DragStyle, defina como o objeto responde ao movimento via ResponseStyle, e aplique opcionalmente limites de eixo, movimento ou limites de arrasto.
Scripts podem responder à manipulação de objetos arrastados para acionar respostas lógicas, como ajustar configurações.
UIDragDetectors funcionam no modo de edição e reprodução do Studio, desde que você não esteja usando as ferramentas Selecionar, Mover, Escalar ou Rotacionar, nem certos plugins ou ferramentas do editor de UI do Studio.
Tornar elementos de UI arrastáveis
Para tornar qualquer instância de GuiObject arrastável, basta adicionar um UIDragDetector como um descendente direto.
No menu, insira um UIDragDetector.

Por padrão, o objeto agora será arrastável na interface LayerCollector.
Personalizar detectores de arrasto de UI
Estilo de arrasto
UIDragDetectors mapeiam o movimento do cursor para calcular o movimento 2D proposto e/ou rotação. Através da propriedade DragStyle, você pode escolher entre diferentes mapeamentos para atender às suas necessidades. Por exemplo, Enum.UIDragDetectorDragStyle.TranslatePlane produz tradução no plano 2D do LayerCollector, enquanto Enum.UIDragDetectorDragStyle.Rotate normalmente produz uma rotação em vez de tradução.
| Configuração | Descrição |
|---|---|
| TranslateLine | Movimento 1D ao longo do DragAxis do detector. |
| TranslatePlane | Movimento 2D no plano do LayerCollector. |
| Rotate | Por padrão, rotação em torno da posição central absoluta do GuiObject pai do detector. Se ReferenceUIInstance estiver definido, a rotação ocorre em torno da posição central absoluta dessa instância. |
| Scriptable | Calcula o movimento desejado através de uma função personalizada fornecida através de SetDragStyleFunction(). |
Direção do arrasto
Por padrão, o movimento 2D e o DragStyle associado mapeiam para o espaço do ancestral LayerCollector. No entanto, você pode querer mudar o ReferenceUIInstance ou o DragAxis ao construir diferentes componentes de UI.
| Configuração | Descrição | Padrão |
|---|---|---|
| ReferenceUIInstance | Uma instância de GuiObject cujo espaço local e posição central absoluta é o espaço de referência e origem para o detector. Definir essa referência afeta propriedades como DragUDim2, DragRotation, e o comportamento de DragAxis. | nil |
| DragAxis | Valor Vector2 que define o eixo de movimento para o objeto arrastado quando DragStyle está definido como Enum.UIDragDetectorDragStyle.TranslateLine. O eixo é definido no espaço local do UIDragDetector, a menos que ReferenceUIInstance esteja definido, caso em que o eixo é definido no espaço local dessa instância. | (1, 0) |
Resposta ao movimento
A propriedade UIDragDetector.ResponseStyle especifica como o valor da posição de um objeto é alterado pelo movimento proposto. Os estilos de resposta personalizados permitem que você use os valores resultantes de UIDragDetector.DragUDim2 e UIDragDetector.DragRotation conforme desejado, sem que o pai do detector execute o movimento proposto.
| Configuração | Descrição |
|---|---|
| Offset | Mover pelos valores Offset da posição do GuiObject pai do detector. Esta é a configuração padrão. |
| Scale | Mover pelos valores Scale da posição do GuiObject pai do detector. |
| CustomOffset | O elemento de UI não se moverá, mas os valores Offset do DragUDim2 do detector ainda serão atualizados e os eventos do detector ainda serão acionados, permitindo que você responda à manipulação de arrasto como desejar. |
| CustomScale | O elemento de UI não se moverá, mas os valores Scale do DragUDim2 do detector ainda serão atualizados e os eventos do detector ainda serão acionados, permitindo que você responda à manipulação de arrasto como desejar. |
Limites de tradução e rotação
Por padrão, não há limites para o movimento 2D além das restrições inerentes do DragStyle. Limites para traduções e rotações mínimas e máximas podem ser declarados com as seguintes propriedades, se desejado. Além disso, você pode definir como o objeto arrastado é restringido dentro dos limites de um GuiObject especificado, como um Frame.
| Propriedades | Descrição | Padrão |
|---|---|---|
| MinDragTranslation MaxDragTranslation | Limites para a tradução de arrasto em cada dimensão, definidos por um valor UDim2. Se MaxDragTranslation for maior que MinDragTranslation, a tradução será restringida dentro desse intervalo. | {0, 0}, {0, 0} |
| MinDragAngle MaxDragAngle | Somente relevante se DragStyle estiver definido como Enum.UIDragDetectorDragStyle.Rotate, ou se as funções definidas através de SetDragStyleFunction() ou AddConstraintFunction() definirem um valor de rotação. Se MaxDragAngle for maior que MinDragAngle, a rotação será restringida dentro desse intervalo. | 0 |
| BoundingBehavior | Determina o comportamento de limite da instância UIDragDetector quando seu BoundingUI está definido. Definir isso como EntireObject limita toda a UI arrastada dentro do BoundingUI, enquanto definir como HitPoint limita a UI arrastada apenas pelo ponto de impacto/captura exato e sua respectiva posição após tradução/rotação. Como conveniência, o padrão de Automatic imita o comportamento de EntireObject para um objeto de UI que está totalmente contido pelo BoundingUI, ou então HitPoint para um objeto de UI que está parcialmente fora do BoundingUI. | Automatic |
Ajustes de velocidade
Através de SelectionModeDragSpeed e SelectionModeRotateSpeed, você pode ajustar as velocidades máximas de arrasto/rotação para um detector. Além disso, através de UIDragSpeedAxisMapping, você pode ajustar as velocidades de arrasto nas dimensões X/Y, com base na SelectionModeDragSpeed do detector.
| Propriedade | Descrição |
|---|---|
| SelectionModeDragSpeed | Define a velocidade máxima de arrasto para tradução como uma combinação de Scale e Offset do primeiro ancestral ScreenGui ou SurfaceGui ao qual o UIDragDetector pertence. |
| SelectionModeRotateSpeed | Define o ângulo máximo por segundo em que o UIDragDetector pode rotacionar. |
| UIDragSpeedAxisMapping | Determina as velocidades de arrasto nas dimensões X/Y, com base na SelectionModeDragSpeed do detector. O padrão é XY, significando que as velocidades dos eixos X e Y são baseadas nos valores Scale/Offset de X e Y, respectivamente. Alternativas são XX e YY, significando que as velocidades dos eixos X e Y são baseadas no eixo X (XX) ou eixo Y (YY) para Scale, enquanto os valores Offset ainda se aplicam aos seus respectivos eixos. Por exemplo, se o primeiro ancestral ScreenGui tiver tamanho 800×600 e SelectionModeDragSpeed for {0.1, 10}, {0.1, 20}, uma configuração de XX resulta em uma velocidade de arrasto X/Y de 80+10/80+20, enquanto YY resulta em 60+10/60+20 (note que os valores Offset permanecem os mesmos em ambos os casos). |
Respostas de script ao clicar e arrastar
Através de sinais de eventos, mudanças de propriedades, estilo de arrasto Scriptable, e funções personalizadas, scripts podem responder à manipulação de elementos de UI arrastados para acionar várias configurações ou tomar decisões lógicas, como deslizadores que ajustam o volume de música e efeitos sonoros separadamente.
Sinais de eventos
Através dos seguintes sinais de eventos, você pode detectar quando um usuário começa, continua e termina de arrastar um objeto.
| Evento | Descrição |
|---|---|
| DragStart | Dispara quando um usuário começa a arrastar o objeto. |
| DragContinue | Dispara quando um usuário continua arrastando o objeto após DragStart ter sido iniciado. |
| DragEnd | Dispara quando um usuário para de arrastar o objeto. |
O seguinte slider designa seu contêiner como o BoundingUI para limitar seu movimento dentro da área do contêiner, permitindo que o arrasto baseado em escala TranslateLine seja limitado à largura total do contêiner sem necessidade de script adicional.
-- A hierarquia é SliderContainer ⟩ Handle ⟩ UIDragDetector ⟩ (este script)
local sliderContainer = script.Parent.Parent.Parent
local handle = sliderContainer:FindFirstChild("Handle")
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- Define arrasto por escala
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.TranslateLine -- Restringe arrasto a linha
uiDragDetector.BoundingUI = sliderContainer
-- Inicialmente define a transparência do contêiner para o valor de escala X da alça
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
-- Expande a borda da alça para indicar o início do arrasto
uiDragDetector.DragStart:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 6
end)
-- Muda a transparência de acordo com quanto foi arrastado em escala
uiDragDetector.DragContinue:Connect(function(inputPosition)
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
end)
-- Reverte a borda da alça para indicar o fim do arrasto
uiDragDetector.DragEnd:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 4
end)Mudanças de posição e rotação
Além dos sinais de eventos, você pode monitorar mudanças nas propriedades DragUDim2 e/ou DragRotation do detector diretamente.
O seguinte detector tem seu DragStyle definido como Rotate, permitindo que os usuários arrastem a alça ao redor do anel rotativo de matiz, enquanto detectam mudanças na rotação de arrasto através de Instance:GetPropertyChangedSignal().
local handle = script.Parent.Parent -- Elemento de UI a ser arrastado
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.Rotate -- Define o estilo de arrasto para rotacionar
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
-- Inicialmente define a matiz para a rotação da alça
changeHue()
-- Conecta a função ao GetPropertyChangedSignal() da rotação de arrasto do detector
uiDragDetector:GetPropertyChangedSignal("DragRotation"):Connect(changeHue)Estilo de arrasto scriptado
Se você definir o UIDragDetector.DragStyle de um detector como Enum.UIDragDetectorDragStyle.Scriptable, você pode fornecer sua própria função que recebe um Vector2 da posição de entrada e retorna um UDim2 (posição) e um float (rotação). O detector atualizará o objeto para a posição/rotação computada com base nos retornos, na propriedade DragSpace, e na propriedade DragRelativity.
Por padrão, o UDim2 e o float retornados serão a posição/rotação final desejada no espaço local do pai do detector. Limites de tradução/rotação existentes ainda se aplicarão, assim como limites de contorno impostos por uma instância de BoundingUI especificada.
O seguinte exemplo arrasta um elemento de UI seguindo uma onda senoidal computada pela mudança na coordenada X de entrada. Note que o DragSpace do detector está definido como Enum.UIDragDetectorDragSpace.Relative.
local frame = script.Parent -- Elemento de UI a ser arrastado
local uiDragDetector = frame:FindFirstChildWhichIsA("UIDragDetector")
local initialXValue = 0
local maxHeightChange = 200
local pixelsPerRadian = 75 -- Diminua este valor para aumentar a frequência
uiDragDetector.DragStart:Connect(function(inputPosition)
initialXValue = inputPosition.X
end)
local function computeSinWaveCoordinate(inputPosition)
local deltaX = inputPosition.X - initialXValue
-- Delta Y negativo para que suba na tela com a mudança positiva de Y
local deltaY = -math.sin(deltaX / pixelsPerRadian) * maxHeightChange
return UDim2.fromOffset(deltaX, deltaY)
end
uiDragDetector:SetDragStyleFunction(computeSinWaveCoordinate)Função de restrição personalizada
UIDragDetectors não têm regras de movimento integradas sobre grades e encaixes, mas você pode registrar funções de restrição personalizadas para editar o UIDragDetector.DragUDim2 e UIDragDetector.DragRotation do detector antes que sejam aplicadas. Por exemplo, você pode manter o movimento em uma grade arredondando posições para incrementos específicos ou definir áreas de movimento permitidas. Note que isso é aplicado antes de quaisquer limites de tradução/rotação existentes.
O seguinte exemplo utiliza uma função de restrição que limita o arrasto planar em uma grade X/Y com base no número de linhas e colunas. Note que o ResponseStyle do detector está definido como Enum.UIDragDetectorResponseStyle.Scale e seu BoundingUI está definido como o contêiner da grade.
-- A hierarquia é GridContainer ⟩ Handle ⟩ UIDragDetector ⟩ (este script)
local gridContainer = script.Parent.Parent.Parent
local handle = gridContainer:FindFirstChild("Handle") -- Elemento de UI a ser arrastado
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- Define arrasto por escala
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)