UI 드래그 감지기

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

UIDragDetector 인스턴스는 슬라이더, 스피너 등과 같은 게임의 2D 사용자 인터페이스 요소와의 상호작용을 촉진하고 장려합니다. 주요 기능은 다음과 같습니다:

  • GuiObject 인스턴스 아래에 UIDragDetector를 배치하여 코드 한 줄 없이 모든 사용자 입력을 통해 드래그 가능하게 만듭니다.

  • 여러 가지 DragStyle 옵션 중에서 선택하고, ResponseStyle를 통해 객체가 움직임에 어떻게 반응하는지 정의하며, 선택적으로 축, 이동 제한 또는 드래그 경계를 적용할 수 있습니다.

  • 스크립트는 드래그된 객체의 조작에 반응하여 설정 조정과 같은 논리적 반응을 유도할 수 있습니다.

  • UIDragDetectorsSelect, Move, Scale, Rotate 도구를 사용하지 않거나 특정 플러그인 또는 Studio의 UI 편집기 도구를 사용하지 않는 한 Studio의 편집 및 재생 모드에서 작동합니다.

UI 요소를 드래그 가능하게 만들기

모든 GuiObject 인스턴스를 드래그 가능하게 만들려면, UIDragDetector를 직접 자손으로 추가하기만 하면 됩니다.

  1. Explorer 창에서 GuiObject 인스턴스 위에 마우스를 올리고 ⊕ 버튼을 클릭합니다. 컨텍스트 메뉴가 표시됩니다.

  2. 메뉴에서 UIDragDetector를 삽입합니다.

  3. 기본적으로 이제 객체는 LayerCollector 인터페이스에서 드래그 가능하게 됩니다.

UI 드래그 감지기 사용자 정의

드래그 스타일

UIDragDetectors는 커서 움직임을 매핑하여 제안된 2D 움직임 및/또는 회전을 계산합니다. DragStyle 속성을 통해 필요에 맞는 다양한 매핑 중에서 선택할 수 있습니다. 예를 들어, Enum.UIDragDetectorDragStyle.TranslatePlaneLayerCollector의 2D 평면에서 변환을 생성하며, Enum.UIDragDetectorDragStyle.Rotate는 일반적으로 변환 대신 회전을 생성합니다.

설정설명
TranslateLine감지기의 DragAxis를 따라 1D 움직임.
TranslatePlaneLayerCollector의 평면에서 2D 움직임.
Rotate기본적으로 감지기의 부모 GuiObject의 절대 중심 위치를 중심으로 회전합니다. ReferenceUIInstance가 설정된 경우, 해당 인스턴스의 절대 중심 위치를 중심으로 회전합니다.
ScriptableSetDragStyleFunction()을 통해 제공된 사용자 정의 함수에 따라 원하는 움직임을 계산합니다.

드래그 방향

기본적으로 2D 움직임과 관련된 DragStyle는 조상 LayerCollector의 공간에 매핑됩니다. 그러나 다양한 UI 구성 요소를 구축할 때 ReferenceUIInstance 또는 DragAxis를 변경하고 싶을 수 있습니다.

설정설명기본값
ReferenceUIInstance감지기의 참조 공간과 원점이 되는 GuiObject 인스턴스입니다. 이 참조를 설정하면 DragUDim2, DragRotationDragAxis의 동작과 같은 속성에 영향을 미칩니다.nil
DragAxisVector2 값으로, DragStyleEnum.UIDragDetectorDragStyle.TranslateLine으로 설정될 때 드래그된 객체의 이동 축을 정의합니다. 축은 UIDragDetector의 로컬 공간에서 정의되며, ReferenceUIInstance가 정의된 경우 해당 인스턴스의 로컬 공간에서 정의됩니다.(1, 0)

움직임에 대한 반응

UIDragDetector.ResponseStyle 속성은 제안된 움직임에 의해 객체의 위치 값이 어떻게 변경되는지를 지정합니다. 사용자 정의 응답 스타일을 통해 결과 UIDragDetector.DragUDim2UIDragDetector.DragRotation 값을 원하는 대로 사용할 수 있으며, 감지기의 부모가 제안된 움직임을 실행하지 않도록 할 수 있습니다.

설정설명
Offset감지기의 부모 GuiObject.Position 값의 Offset 값에 따라 이동합니다. 기본적으로 이 설정입니다.
Scale감지기의 부모 GuiObject.Position 값의 Scale 값에 따라 이동합니다.
CustomOffsetUI 요소는 전혀 이동하지 않지만, 감지기의 DragUDim2Offset 값은 여전히 업데이트되며, 감지기의 이벤트는 여전히 발생하여 드래그 조작에 원하는 대로 반응할 수 있습니다.
CustomScaleUI 요소는 전혀 이동하지 않지만, 감지기의 DragUDim2Scale 값은 여전히 업데이트되며, 감지기의 이벤트는 여전히 발생하여 드래그 조작에 원하는 대로 반응할 수 있습니다.

변환 및 회전 제한

기본적으로 DragStyle의 고유한 제한 외에 2D 움직임에 대한 제한은 없습니다. 필요에 따라 최소 및 최대 변환 및 회전을 선언할 수 있는 다음 속성을 사용할 수 있습니다. 또한 드래그된 객체가 특정 GuiObject의 경계 내에서 어떻게 제약되는지를 정의할 수 있습니다.

속성설명기본값
MinDragTranslation
MaxDragTranslation
각 차원에서 드래그 변환에 대한 제한을 정의하며, UDim2 값으로 정의됩니다. MaxDragTranslationMinDragTranslation보다 크면, 변환은 해당 범위 내에서 제한됩니다.{0, 0}, {0, 0}
MinDragAngle
MaxDragAngle
DragStyleEnum.UIDragDetectorDragStyle.Rotate로 설정되었거나, SetDragStyleFunction() 또는 AddConstraintFunction()을 통해 설정된 함수가 회전 값을 정의하는 경우에만 관련이 있습니다. MaxDragAngleMinDragAngle보다 크면, 회전은 해당 범위 내에서 제한됩니다.0
BoundingBehavior감지기의 BoundingUI가 설정될 때 감지기의 경계 동작을 결정합니다. 이를 EntireObject로 설정하면 드래그된 UI 전체가 BoundingUI 내에 제한되며, HitPoint로 설정하면 드래그된 UI는 정확한 히트/잡기 지점과 변환/회전 후의 해당 위치에 의해서만 제한됩니다. 편의상, Automatic의 기본값은 BoundingUI에 완전히 포함된 UI 객체에 대해 EntireObject 동작을 모방하며, 그렇지 않으면 HitPoint로 설정됩니다.Automatic

속도 조정

SelectionModeDragSpeedSelectionModeRotateSpeed를 통해 감지기의 최대 드래그/회전 속도를 미세 조정할 수 있습니다. 또한 UIDragSpeedAxisMapping을 통해 감지기의 SelectionModeDragSpeed에 따라 X/Y 차원 드래그 속도를 미세 조정할 수 있습니다.

속성설명
SelectionModeDragSpeed감지기가 속한 첫 번째 조상 ScreenGui 또는 SurfaceGuiScaleOffset의 조합으로 변환에 대한 최대 드래그 속도를 정의합니다.
SelectionModeRotateSpeedUIDragDetector가 회전할 수 있는 최대 각도를 초당 정의합니다.
UIDragSpeedAxisMapping감지기의 SelectionModeDragSpeed에 따라 X/Y 차원 드래그 속도를 결정합니다. 기본값은 XY로, XY 축 속도가 각각 XYScale/Offset 값에 기반합니다.

대안으로는 XXYY가 있으며, 이는 XY 축 속도가 각각 ScaleX (XX) 또는 Y (YY) 축에 기반함을 의미합니다. 이 경우 Offset 값은 여전히 각 축에 적용됩니다. 예를 들어, 첫 번째 조상 ScreenGui의 크기가 800×600이고 SelectionModeDragSpeed{0.1, 10}, {0.1, 20}인 경우, XX 설정은 X/Y 드래그 속도가 80+10/80+20이 되며, YY60+10/60+20이 됩니다 (참고로 Offset 값은 두 경우 모두 동일하게 유지됩니다).

클릭 및 드래그에 대한 스크립트 반응

이벤트 신호, 속성 변경, Scriptable 드래그 스타일 및 사용자 정의 함수를 통해 스크립트는 드래그된 UI 요소의 조작에 반응하여 다양한 설정을 조정하거나 논리적 결정을 내릴 수 있습니다. 예를 들어, 음악 및 음향 효과 볼륨을 별도로 조정하는 슬라이더가 있습니다.

이벤트 신호

다음 이벤트 신호를 통해 사용자가 객체를 드래그하기 시작하고, 계속하고, 끝낼 때를 감지할 수 있습니다.

이벤트설명
DragStart사용자가 객체를 드래그하기 시작할 때 발생합니다.
DragContinue사용자가 DragStart가 시작된 후 객체를 계속 드래그할 때 발생합니다.
DragEnd사용자가 객체의 드래그를 중지할 때 발생합니다.

다음 슬라이더는 컨테이너를 BoundingUI로 지정하여 컨테이너 영역 내에서의 움직임을 제한하며, 스케일 기반의 TranslateLine 드래그가 추가 스크립트 없이 컨테이너의 전체 너비로 제한되도록 합니다.

UIDragDetector - 이벤트 신호 투명도 변경
-- 계층 구조는 SliderContainer ⟩ Handle ⟩ UIDragDetector ⟩ (이 스크립트)
local sliderContainer = script.Parent.Parent.Parent
local handle = sliderContainer:FindFirstChild("Handle")
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- 스케일로 드래그 설정
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.TranslateLine -- 드래그를 선으로 제한
uiDragDetector.BoundingUI = sliderContainer
-- 처음에 핸들의 X 스케일 값으로 컨테이너 투명도 설정
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
-- 잡기 시작을 나타내기 위해 핸들 테두리 확장
uiDragDetector.DragStart:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 6
end)
-- 스케일에 따라 얼마나 드래그했는지에 따라 투명도 변경
uiDragDetector.DragContinue:Connect(function(inputPosition)
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
end)
-- 잡기 종료를 나타내기 위해 핸들 테두리 복원
uiDragDetector.DragEnd:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 4
end)

위치 및 회전 변경

이벤트 신호 외에도 감지기의 DragUDim2 및/또는 DragRotation 속성의 변경 사항을 직접 모니터링할 수 있습니다.

다음 감지기는 DragStyleRotate로 설정되어 있어 사용자가 색상 회전 링 주위를 핸들을 드래그할 수 있으며, Instance:GetPropertyChangedSignal()을 통해 드래그 회전의 변화를 감지합니다.

UIDragDetector - DragRotation 변경
local handle = script.Parent.Parent -- 드래그할 UI 요소
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.Rotate -- 드래그 스타일을 회전으로 설정
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
-- 처음에 핸들의 회전으로 색상 설정
changeHue()
-- 감지기의 드래그 회전의 GetPropertyChangedSignal()에 함수를 연결
uiDragDetector:GetPropertyChangedSignal("DragRotation"):Connect(changeHue)

스크립트 드래그 스타일

감지기의 UIDragDetector.DragStyleEnum.UIDragDetectorDragStyle.Scriptable로 설정하면, 입력 위치의 Vector2를 받아들이고 UDim2(위치) 및 부동 소수점(회전)을 반환하는 사용자 정의 함수를 제공할 수 있습니다. 감지기는 반환된 값을 기반으로 객체를 계산된 위치/회전으로 업데이트합니다. DragSpace 속성과 DragRelativity 속성도 적용됩니다.

기본적으로 반환된 UDim2 및 부동 소수점은 감지기의 부모의 로컬 공간에서 최종 원하는 위치/회전입니다. 기존의 변환/회전 제한은 여전히 적용되며, 지정된 BoundingUI 인스턴스에 의해 부과된 경계 제한도 적용됩니다.

다음 예제는 X 좌표 입력의 변화에 따라 사인 곡선을 따라 UI 요소를 드래그합니다. 감지기의 DragSpaceEnum.UIDragDetectorDragSpace.Relative로 설정되어 있음을 주의하세요.

UIDragDetector - 사인 곡선을 따라 드래그
local frame = script.Parent -- 드래그할 UI 요소
local uiDragDetector = frame:FindFirstChildWhichIsA("UIDragDetector")
local initialXValue = 0
local maxHeightChange = 200
local pixelsPerRadian = 75 -- 이 값을 낮추면 주파수가 증가합니다.
uiDragDetector.DragStart:Connect(function(inputPosition)
initialXValue = inputPosition.X
end)
local function computeSinWaveCoordinate(inputPosition)
local deltaX = inputPosition.X - initialXValue
-- Y 델타가 음수여야 화면에서 긍정적인 Y 변화로 "위"로 이동합니다.
local deltaY = -math.sin(deltaX / pixelsPerRadian) * maxHeightChange
return UDim2.fromOffset(deltaX, deltaY)
end
uiDragDetector:SetDragStyleFunction(computeSinWaveCoordinate)

사용자 정의 제약 함수

UIDragDetectors는 그리드 및 스냅에 대한 내장된 움직임 규칙이 없지만, 감지기의 UIDragDetector.DragUDim2UIDragDetector.DragRotation이 적용되기 전에 수정할 사용자 정의 제약 함수를 등록할 수 있습니다. 예를 들어, 특정 증가량으로 위치를 반올림하여 그리드에서 움직임을 유지하거나 허용된 움직임 영역을 정의할 수 있습니다. 이는 기존의 변환/회전 제한 이전에 적용됩니다.

다음 예제는 행과 열의 수에 따라 평면 드래그를 X/Y 그리드로 제한하는 제약 함수를 활용합니다. 감지기의 ResponseStyleEnum.UIDragDetectorResponseStyle.Scale로 설정되어 있고, BoundingUI가 그리드 컨테이너로 설정되어 있음을 주의하세요.

UIDragDetector - 그리드에서 드래그, 타일에 스냅
-- 계층 구조는 GridContainer ⟩ Handle ⟩ UIDragDetector ⟩ (이 스크립트)
local gridContainer = script.Parent.Parent.Parent
local handle = gridContainer:FindFirstChild("Handle") -- 드래그할 UI 요소
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- 스케일로 드래그 설정
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 및 Roblox 로고, 'Powering Imagination'은 미국 및 기타 국가 내 당사의 등록 및 미등록 상표입니다.