로블록스 스튜디오 플러그인 개발: DockWidget UI, 개발 툴링 & 크리에이터 스토어 수익화

DopaBrain 게임 개발 랩 • 업데이트: 2026년 9월 • 읽는 시간: 9분

개발자 인지 & 집중 도구

대부분의 로블록스 개발자가 일반 게이머를 대상으로 하는 체험 제작에만 집중할 때, 영리한 엔지니어들은 숨겨진 고수익 블루오션을 공략하고 있습니다. 바로 동료 개발자를 위한 "개발 툴(Studio Plugin)" 시장입니다. 로블록스 크리에이터 스토어에서는 자체 제작한 플러그인을 실제 달러(USD)와 로벅스로 판매할 수 있습니다.

상용화 수준의 스튜디오 플러그인을 제작하려면 일반 게임 스크립트와는 완전히 다른 특수 API를 다룰 수 있어야 합니다. 스튜디오 패널에 도킹되는 DockWidgetPluginGui, 작업 실행 취소(Ctrl+Z)를 완벽히 보장하는 ChangeHistoryService, 선택된 오브젝트를 제어하는 Selection API가 핵심입니다. 이 2026 가이드는 플러그인 개발부터 배포까지의 전 과정을 안내합니다.

1. 스튜디오 플러그인 수명 주기 및 보안 권한

플러그인은 로블록스 스튜디오 내부에서 높은 권한으로 실행됩니다:

2. DockWidgetPluginGui를 활용한 도킹 패널 UI

탐색기나 속성 창처럼 스튜디오 화면에 깔끔하게 도킹되는 UI 구축법:

3. ChangeHistoryService를 통한 안전한 실행 취소

초보 개발자가 만든 플러그인의 가장 흔한 결함은 Ctrl+Z(실행 취소)를 망가뜨리는 것입니다:

4. 실전 플러그인 코드: 일괄 파트 최적화 도구

도킹 UI를 띄우고 선택된 메쉬들의 충돌 판정과 그림자를 한 번에 최적화하는 완성형 스크립트:

스튜디오 플러그인 전체 스크립트 (Toolbar & DockWidget)
local ChangeHistoryService = game:GetService("ChangeHistoryService")
local Selection = game:GetService("Selection")

local toolbar = plugin:CreateToolbar("Optimization Tools")
local button = toolbar:CreateButton("Optimizer", "Open Batch Part Optimizer", "rbxassetid://4458901886")

local widgetInfo = DockWidgetPluginGuiInfo.new(
    Enum.InitialDockState.Float,
    false, -- Initially enabled
    false, -- Override previous state
    260, 180, -- Default width, height
    200, 140  -- Min width, height
)

local widget = plugin:CreateDockWidgetPluginGui("BatchOptimizerGui", widgetInfo)
widget.Title = "Mesh Optimizer"

local btnOptimize = Instance.new("TextButton")
btnOptimize.Size = UDim2.new(1, -20, 0, 44)
btnOptimize.Position = UDim2.new(0, 10, 0, 10)
btnOptimize.Text = "선택 파트 일괄 최적화"
btnOptimize.BackgroundColor3 = Color3.fromRGB(16, 185, 129)
btnOptimize.TextColor3 = Color3.fromRGB(255, 255, 255)
btnOptimize.Font = Enum.Font.SourceSansBold
btnOptimize.TextSize = 16
btnOptimize.Parent = widget

button.Click:Connect(function()
    widget.Enabled = not widget.Enabled
end)

btnOptimize.MouseButton1Click:Connect(function()
    local selected = Selection:Get()
    local count = 0
    for _, obj in ipairs(selected) do
        if obj:IsA("BasePart") then
            obj.CastShadow = false
            if obj:IsA("MeshPart") then
                obj.CollisionFidelity = Enum.CollisionFidelity.Box
            end
            count = count + 1
        end
    end
    ChangeHistoryService:SetWaypoint("Optimized " .. count .. " Parts")
    print(string.format("선택된 %d개 파트 최적화 완료!", count))
end)

동작 원리: 상단 리본 메뉴에 버튼을 생성하고, 플로팅 창을 띄운 뒤, 버튼 클릭 시 선택된 파트의 그림자를 끄고 충돌 판정을 Box로 일괄 변경합니다. ChangeHistoryService 웨이포인트가 등록되어 Ctrl+Z로 언제든 되돌릴 수 있습니다.

5. 크리에이터 스토어 배포 및 현금(USD) 수익화

완성된 플러그인을 글로벌 개발자들에게 판매하는 방법:

엔지니어링 사고력 점검 & 문제 해결 스타일 분석

복잡한 개발 도구를 설계하려면 정교한 시스템 설계 감각이 필요합니다. 무료 인지 진단 도구로 문제 해결 성향과 스트레스 회복력을 점검해 보세요.

무료 뇌 유형 & 인지 성향 테스트

자주 묻는 질문 (로블록스 스튜디오 플러그인 개발)

스튜디오 플러그인을 웹에 등록하지 않고 내 컴퓨터에서 바로 테스트하는 법은?

스튜디오 상단 메뉴의 [플러그인] > [플러그인 폴더 열기]를 눌러 나타나는 로컬 폴더에 rbxml 또는 lua 파일을 저장하면 스튜디오가 즉시 인식하여 실행합니다.

플러그인 판매로 실제 달러(USD) 수익을 정산받을 수 있나요?

네. 본인 인증을 완료한 개발자는 로블록스 크리에이터 스토어에서 플러그인 가격을 달러로 설정할 수 있으며, 결제 수수료를 제외한 금액을 현금으로 지급받습니다.

ChangeHistoryService를 쓰지 않으면 어떤 문제가 발생하나요?

플러그인이 수정한 내용이 스튜디오의 실행 취소 스택에 기록되지 않아 개발자가 Ctrl+Z를 눌러도 작업이 취소되지 않거나 엉뚱한 이전 작업이 취소되어 프로젝트를 망칠 수 있습니다.

플러그인 UI를 라이트 모드/다크 모드에 맞추려면?

settings().Studio.ThemeChanged 이벤트를 연결하고 settings().Studio.Theme:GetColor()를 사용하여 시스템 테마에 맞는 색상값을 동적으로 주입하면 됩니다.