Studio는 사용자 정의 widgets 를 만들고 Studio 도구 및 확장으로 사용할 수 있게 해줍니다. 이 위젯은 Studio 내에서 사용자 지정 창/패널로 동작하며, 인터페이스 내에서 도크하거나 별도 창으로 띄울 수 있습니다.
위젯 UI 생성
모든 Studio 위젯은 DockWidgetPluginGui 개체로 시작합니다. 이는 텍스트 레이블 및 버튼과 같은 채우기 위해 사용할 수 있는 GuiObjects 개체입니다. 빈 위젯 GUI를 생
참고하세요 DockWidgetPluginGuiInfo.new() 생성자는 다음과 같이 특정 순서 로 매개 변수를 기대합니다.
# | 속성 | 유형 | 설명 |
---|---|---|---|
1 | Enum.InitialDockState | 열거형 | Engineer.InicialDockState 열거 중 하나. |
2 | InitialEnabled | 부울 | 초기 (표시 가능한) 위젯 GUI 상태. |
3 | InitialEnabledShouldOverrideRestore | 부울 | 값이 참이면 초기 활성화 이전에 저장된 활성화 상태를 재정의합니다. |
4 | FloatingXSize | 정수 | 초기 도크 상태로 설정된 경우 GUI의 초기 너비는 Enum.InitialDockState.Float입니다. |
5 | FloatingYSize | 정수 | 초기 도크 상태로 설정된 경우 기본 높이가 Enum.InitialDockState.Float입니다. |
6 | MinWidth | 정수 | 일부 플랫폼 변형을 위한 최소 GUI 너비. |
7 | MinHeight | 정수 | 일부 플랫폼 변형을 제외한 GUI의 최소 높이. |
-- 새 "DockWidgetPluginGuiInfo" 개체 생성local widgetInfo = DockWidgetPluginGuiInfo.new(Enum.InitialDockState.Float, -- 위젯은 떠있는 패널에서 초기화됩니다.true, -- 초기에 위젯이 활성화됩니다false, -- 이전에 활성화된 상태를 덮어쓰지 마십시오.200, -- 부동 창의 기본 너비300, -- 부동 창의 기본 높이150, -- 부동 창의 최소 너비150 -- 부동 창의 최소 높이)-- 새로운 위젯 GUI 생성local testWidget = plugin:CreateDockWidgetPluginGui("TestWidget", widgetInfo)testWidget.Title = "Test Widget" -- Optional widget title
위젯 UI 사용자 정의
위젯을 만들면 사용자 인터페이스를 사용자 정의하려면 GuiObjects 와 같은 정보 TextLabels 또는 상호 작용 ImageButtons 을 사용합니다. 예를 들어, 다음 코드는 기본 1> Class.TextButton
-- 새로운 위젯 GUI 생성local testWidget = plugin:CreateDockWidgetPluginGui("TestWidget", widgetInfo)testWidget.Title = "Test Widget" -- 옵션 위젯 타이틀local testButton = Instance.new("TextButton")testButton.BorderSizePixel = 0testButton.TextSize = 20testButton.TextColor3 = Color3.new(1,0.2,0.4)testButton.AnchorPoint = Vector2.new(0.5,0.5)testButton.Size = UDim2.new(1,0,1,0)testButton.Position = UDim2.new(0.5,0,0.5,0)testButton.SizeConstraint = Enum.SizeConstraint.RelativeYYtestButton.Text = "Click Me"testButton.Parent = testWidget
Studio 색상 테마 변경
효과적인 Studio 위젯은 Studio 테마 설정과 동기화되어야 하며 테마가 변경될 때 동적으로 조정됩니다. 예를 인스턴스, 개발자가 암흑 테마를 사용하는 경우 배경 색, 이미지 및 텍스트 레이블이 Studio의 네이티브 테마 색과 함께 멋지게 표시됩니다.
다음 코드 추가는 테이블의 GUI 개체와 함께 동기화하기 위한 기능을 사용하는 syncGuiColors() 함수를
testButton.Parent = testWidget
local function syncGuiColors(objects)
local function setColors()
for _, guiObject in objects do
-- 배경 색상 동기화
guiObject.BackgroundColor3 = settings().Studio.Theme:GetColor(Enum.StudioStyleGuideColor.MainBackground)
-- 텍스트 색상 동기화
guiObject.TextColor3 = settings().Studio.Theme:GetColor(Enum.StudioStyleGuideColor.MainText)
end
end
-- 색상 동기화를 위해 'setColors()' 함수를 실행하십시오
setColors()
-- ThemeChanged 이벤트를 'setColors()' 함수에 연결하십시오.
settings().Studio.ThemeChanged:Connect(setColors)
end
-- 제공된 개체의 색을 동기화하려면 'SyncGuiColors()' 함수를 실행하십시오
syncGuiColors({testButton})
마우스 커서 사용자 정의
웹 사이트 요소와 관련된 예상되는 상호 작용을 개선하기 위해 시스템 전체 마우스 커서 를 GUI 이벤트에 설정하여 Class.Gui
local function setCursor(cursorAsset)
plugin:GetMouse().Icon = cursorAsset
end
testButton.MouseEnter:Connect(function()
setCursor("rbxasset://SystemCursors/PointingHand")
end)
testButton.MouseLeave:Connect(function()
setCursor("")
end)
다음 표에서 마우스 커서 및 잠재적 사용 사례에 대한 목록을 참조하십시오.
마우스 커서 아이콘 | 자산 | 사용 사례 |
---|---|---|
rbxasset://SystemCursors/Arrow | 기본적으로 클릭 및 선택. | |
rbxasset://SystemCursors/PointingHand | 활성 링크/버튼을 마우스로 이동합니다. | |
rbxasset://SystemCursors/OpenHand | 드래그 가능한 아이템위로 마우스를 이동합니다. | |
rbxasset://SystemCursors/ClosedHand | 아이템드래그합니다. | |
rbxasset://SystemCursors/IBeam | 텍스트 필드에 마우스를 올리는 것. | |
rbxasset://SystemCursors/SizeNS | 세로 크기 조정 핸들 위로 마우스를 이동합니다. | |
rbxasset://SystemCursors/SizeEW | 가로 크기 조정 핸들 위로 마우스를 이동합니다. | |
rbxasset://SystemCursors/SizeNESW | 모서리 크기 조정 핸들 위로 마우스를 이동합니다. | |
rbxasset://SystemCursors/SizeNWSE | 모서리 크기 조정 핸들 위로 마우스를 이동합니다. | |
rbxasset://SystemCursors/SizeAll | 다중 방향 크기 조정 핸들을 마우스로 놓칩니다. | |
rbxasset://SystemCursors/SplitNS | 세로 스플릿 핸들 위로 마우스를 이동합니다. | |
rbxasset://SystemCursors/SplitEW | 가로 스플릿 핸들 위로 마우스를 이동합니다. | |
rbxasset://SystemCursors/Forbidden | 잠긴/금지된 아이템위로 마우스를 이동합니다. | |
rbxasset://SystemCursors/Wait | 동작이 진행 중임을 나타냅니다. | |
rbxasset://SystemCursors/Busy | 시스템이 바쁜지 여부를 나타냅니다. | |
rbxasset://SystemCursors/Cross | 핀 선택 영역에 마우스를 이동합니다. |
사용자 입력 수집
Class.abet 및 TextButton와 같은 UI 요소는 Studio 위젯에서 정상적으로 작동하며 Roblox에서 빌드할 수 있습니다. UserInputService 및 1>Class.ContextActionService1>는 주 게임 창이 집중되어 있기를 기대하므로 작동하
일반적인 입력 이벤트에 대한 하나의 작업 환경은 전체 화면에 투명한 Frame 을 생성하고 위에 표시하는 것입니다. 다음 코드 샘플은 프레임을 생성하고 사용자가 프레임을 클릭하면 GuiObject.InputBegan 이벤트가 프레임에 대한 키보드 입력을
local frame = Instance.new("Frame")
frame.BackgroundTransparency = 1 -- 프레임 숨기기
frame.Size = UDim2.new(1, 0, 1, 0) -- 화면 덮기
frame.Position = UDim2.new(0, 0, 0, 0)
frame.Parent = testWidget
local function onInputBegan(inputObject)
-- 여기에서 입력 개체를 처리하는 경우, 예를 들어 키 누르기를 감지하는 등
end
frame.InputBegan:Connect(onInputBegan)
드래그 및 드롭 인터랙션
드래그 및 드롭 인터액션을 사용하여 위젯에 대한 데이터 흐름을 개선하는 간단한 방법입니다. 이 인터액션을 생성하려면 드래그할 요소를 정의해야 하고, 드래그를 시작하고, 드롭 대상을 생성하고, 드롭 작업을 처리해야 합니다.
드래그 소스 생성
사용자가 일부 UI 요소에서 마우스 버튼을 누르면 Plugin:StartDrag() 를 호출하여 드래그 작업을 시작할 수 있습니다. 이 경우 일반적으로 TextButton 또는 ImageButton 내의 위젯에 텍스트 버튼이 있습니다. 다음 코드 샘플은
-- 먼저 위젯을 생성하십시오local widgetInfo = DockWidgetPluginGuiInfo.new(Enum.InitialDockState.Float, true, true, 300, 200)local dragSourceWidget = plugin:CreateDockWidgetPluginGui("Drag Source", widgetInfo)dragSourceWidget.Title = "Drag Source"-- 드래그를 시작하는 TextButton 생성local dragButton = Instance.new("TextButton")dragButton.Size = UDim2.new(1, 0, 1, 0)dragButton.Text = "Drag me!"dragButton.Parent = dragSourceWidget
드래그 시작
사용자가 TextButton 를 클릭하면, MouseButton1Down() 이벤트를 시작하여 사용자가 마우스 버튼을 누르는 즉시 드래그를 시작할 수 있습니다.
연결된 함수 내에서 데이터를 드래그해야 합니다. 데이터의 유형은 MimeType 키에 반영되어야 하고, 드래그의 콘텐츠는 2> Data
local function onButton1Down()
local dragInfo = {
Data = "Hello, world", -- 데이터 끌기
MimeType = "text/plain", -- 데이터의 MIME 유형을 설명합니다.
Sender = "SomeDragSource", -- 데이터가 어디에서 원래인지 설명합니다.
MouseIcon = "", -- 커서에 사용할 이미지 콘텐츠
DragIcon = "", -- 드래그 중에 커서 아래에 있는 이미지 콘텐츠 렌더링
HotSpot = Vector2.zero -- DragIcon에서 커서를 중심으로 하는 곳
}
plugin:StartDrag(dragInfo)
end
dragButton.MouseButton1Down:Connect(onButton1Down)
드롭 대상 생성
이 이벤트는 사용자가 드래그 중에 창에 마우스를 릴리스할 때 PluginGui.PluginDragDropped 발생합니다. 이 이벤트가 발생하면 Class.TextLabel 와 같은 드롭 대상을 정의해야 합니다. 이는 드롭을 감지하는 두 번째 위젯을 가진 컨테이너를 정의합니다.
local dragTargetWidget = plugin:CreateDockWidgetPluginGui("Drop Target", widgetInfo)dragTargetWidget.Title = "Drop Target"-- 이 텍스트 레이블은 드롭된 항목을 표시합니다.This TextLabel will display what was droppedlocal textLabel = Instance.new("TextLabel")textLabel.Size = UDim2.new(1, 0, 1, 0)textLabel.Text = "Drop here..."textLabel.Parent = dragTargetWidget
드롭 액션 처리
드롭 대상을 생성한 후 드롭 대상 위젯에 PluginGui.PluginDragDropped 이벤트를 연결하십시오.
local function onDragDrop(dragData)
print("PluginDragDropped")
if dragData.MimeType == "text/plain" then
textLabel.Text = dragData.Data
else
textLabel.Text = dragData.MimeType
end
end
dragTargetWidget.PluginDragDropped:Connect(onDragDrop)
드래그가 아직 진행 중인 동안 이 세 이벤트는 사용자가 마우스를 해당 위젯에 이동하면 트리거됩니다.
- PluginDragEntered – 사용자가 창에 마우스를 올 때 실행됩니다.
- PluginDragMoved – 사용자가 창을 마우스로 이동할 때 반복적으로 실행됩니다. 이는 "여기에 드롭하세요!"라는 메시지를 표시하는 데 유용합니다.
- PluginDragLeft – 사용자의 커서가 창을 떠나면 실행됩니다. 이렇게 하면 “여기에 드롭하세요!”라는 메시지를 숨길 수 있습니다.