mcpField
R
roblox-gui

roblox-gui

github.com/flatbedjDesign & UI058 installsUpdated 6w ago
Repository

About roblox-gui

A reference skill for building Roblox GUI, covering container choices, sizing, responsive layouts, animation, and common implementation patterns. It is intended for developers implementing screen and world-space interfaces.

Key features

  1. 01Choose ScreenGui, SurfaceGui, or BillboardGui
  2. 02Size and position with UDim2
  3. 03Build responsive layouts
  4. 04Animate properties with TweenService
  5. 05Handle GUI persistence across respawns

Use cases

  1. 01Create a screen HUD or menu
  2. 02Place labels on parts or characters
  3. 03Adapt interface layouts to mobile sizes

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/flatbedj/roblox-skills --skill roblox-gui

After installing, type/roblox-guiin Claude Code to confirm it loaded.

Details

From the project README

Roblox GUI Reference

Native Robux symbol

Use Roblox's native Robux glyph in text labels and buttons instead of an image icon: utf8.char(0xE002) (equivalently, the Luau string escape "\u{E002}"). Keep the glyph in the same text object as the price so spacing, scaling, and regional-price updates stay together.

GUI Container Types

ContainerParentUse Case
ScreenGuiPlayerGuiHUDs, menus, overlays — always faces screen
SurfaceGuiBasePartWorld-space UI on a part surface (signs, screens)
BillboardGuiBasePart or ModelFloats above a part in 3D space (name tags, health bars)
ScreenGui
-- LocalScript in StarterGui or StarterPlayerScripts
local player = game:GetService("Players").LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")

local screenGui = Instance.new("ScreenGui")
screenGui.Name = "HUD"
screenGui.ResetOnSpawn = false   -- keep GUI across respawns
screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
screenGui.Parent = playerGui
SurfaceGui
local surfaceGui = Instance.new("SurfaceGui")
surfaceGui.Face = Enum.NormalId.Front
surfaceGui.SizingMode = Enum.SurfaceGuiSizingMode.PixelsPerStud
surfaceGui.PixelsPerStud = 50
surfaceGui.Parent = workspace.ScreenPart

local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.Text = "Hello World"
label.Parent = surfaceGui
BillboardGui
local billboard = Instance.new("BillboardGui")
billboard.Size = UDim2.fromOffset(200, 50)
billboard.StudsOffset = Vector3.new(0, 2.5, 0)  -- float above head
billboard.AlwaysOnTop = false
billboard.Parent = character:WaitForChild("Head")

local nameLabel = Instance.new("TextLabel")
nameLabel.Size = UDim2.fromScale(1, 1)
nameLabel.BackgroundTransparency = 1
nameLabel.Text = player.DisplayName
nameLabel.Parent = billboard

UDim2 Sizing and Positioning

UDim2.new(xScale, xOffset, yScale, yOffset) — scale is 0–1 relative to parent, offset is pixels.

frame.Size     = UDim2.new(1, 0, 0, 50)       -- full width, 50px tall
frame.Position = UDim2.new(0, 0, 0, 0)         -- top-left corner

frame.Size     = UDim2.fromScale(0.6, 0.4)     -- 60% wide, 40% tall
frame.Position = UDim2.new(0.2, 0, 0.3, 0)    -- centered (0.2 = (1-0.6)/2)

UDim2.fromScale(0.5, 0.5)    -- scale only
UDim2.fromOffset(300, 150)   -- pixels only

AnchorPoint shifts the element's pivot (0–1 on each axis):

frame.AnchorPoint = Vector2.new(0.5, 0.5)   -- pivot at center
frame.Position    = UDim2.fromScale(0.5, 0.5)  -- truly centered on screen

Responsive Design

Prefer scale over offset so UI adapts to all screen sizes.

button.Size     = UDim2.fromScale(0.2, 0.07)
button.Position = UDim2.new(0.4, 0, 0.85, 0)

-- Prevent distortion with UIAspectRatioConstraint
local arc = Instance.new("UIAspectRatioConstraint")
arc.AspectRatio = 4   -- width:height = 4:1
arc.Parent = button

TweenService Animations

local TweenService = game:GetService("TweenService")
local tweenInfo = TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)

local menuFrame = script.Parent

local function openMenu()
    TweenService:Create(menuFrame, tweenInfo, {
        Position = UDim2.new(0.05, 0, 0.1, 0)
    }):Play()
end

local function closeMenu()
    TweenService:Create(menuFrame, tweenInfo, {
        Position = UDim2.new(-0.5, 0, 0.1, 0)
    }):Play()
end

-- Animated progress bar
local function setProgress(bar, pct)
    TweenService:Create(bar, TweenInfo.new(0.2), {
        Size = UDim2.new(pct, 0, 1, 0)
    }):Play()
end

LocalScript Placement

LocationNotes
StarterGuiCloned into PlayerGui on join; use ResetOnSpawn = false to persist
StarterPlayerScriptsRuns once, not reset on respawn; good for persistent managers
StarterCharacterScriptsRe-runs each spawn; suited for character-dependent UI
-- Safe pattern: wait for character
local player = game:GetService("Players").LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")

humanoid.HealthChanged:Connect(function(health)
    -- update health bar
end)

ResetOnSpawn

screenGui.ResetOnSpawn = false  -- persist across respawns (inventory, settings)
screenGui.ResetOnSpawn = true   -- re-create on respawn (respawn timer) — default

Common Patterns Quick Reference

PatternKey Setup
Full-screen overlaySize = UDim2.fromScale(1,1), Position = UDim2.fromScale(0,0)
Bottom-center HUD barAnchorPoint = (0.5,1), Position = UDim2.new(0.5,0,1,-10)
Padded listUIPadding + UIListLayout inside a Frame
Scrollable listScrollingFrame + UIListLayout; set CanvasSize from UIListLayout.AbsoluteContentSize
Rounded cornersUICorner with CornerRadius = UDim.new(0, 8)
Scaled textTextScaled = true on TextLabel/TextButton so font grows with container
Dynamic frame heightAutomaticSize = Enum.AutomaticSize.Y so frame expands to fit children
Health barNested frames: outer = background, inner tweened by Size.X.Scale
Name tagBillboardGui on Head, StudsOffset = Vector3.new(0, 2.5, 0)

Common Mistakes

MistakeFix
GUI disappears on respawnSet ResetOnSpawn = false or use StarterPlayerScripts
UI looks wrong on mobileUse UDim2.fromScale + UIAspectRatioConstraint
Script can't find PlayerGuiUse player:WaitForChild("PlayerGui")
Tween doesn't runEnsure the property is tweenable; Text is not, Position and Size are
BillboardGui visible through wallsVerify AlwaysOnTop = false
AbsoluteSize is zero on first frameRead it inside task.defer or after first render step
Clicks pass through overlapping framesAdd a transparent input-blocking Frame or set Modal = true
SurfaceGui flickersSet LightInfluence = 0; ensure part isn't too thin
Text tiny on mobileSet TextScaled = true — fixed TextSize doesn't adapt to screen size
UI hard to test on mobileUse Studio's Device Emulator (Test tab → Device) to preview layouts

Comments

Markdown supported