Roblox Gui

sentinelcore/roblox-skills/roblox-gui

by sentinelcoref2b1910a7fb898ed35cf2f856e2a2e48e38276bfNo licenseListed Oct 9, 2026Updated Oct 9, 2026

Use when building, animating, or debugging Roblox GUI elements including HUDs, menus, world-space UI, and player labels. Triggers on: ScreenGui setup, SurfaceGui or BillboardGui placement, UDim2 sizing questions, TweenService UI animations, responsive scaling, LocalScript GUI logic, ResetOnSpawn issues, or any Frame/TextLabel/ImageButton layout work.

Instructions onlySoftware Development
AI-generated overview

Reference for building, animating and debugging Roblox GUI elements such as HUDs, menus and world-space UI.

What it does
This skill is a reference document for Roblox GUI development. It covers container types (ScreenGui, SurfaceGui, BillboardGui), UDim2 sizing and positioning, responsive design, TweenService animations, LocalScript placement, ResetOnSpawn behavior, common layout patterns and frequent mistakes. It provides code snippets and tables rather than executable scripts.
When to use it
Use it when creating or debugging Roblox interfaces such as HUDs, menus, overlays, name tags or health bars. It is also relevant for questions about UDim2 sizing, responsive scaling, UI animations or GUI scripts not persisting across respawns.
Requirements
No scripts or assets ship with the skill; it is instructions and code examples only. The examples target Roblox Studio and Luau, and assume access to the Roblox engine and its services.

Roblox GUI Reference

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

lua
-- LocalScript in StarterGui or StarterPlayerScriptslocal player = game:GetService("Players").LocalPlayerlocal playerGui = player:WaitForChild("PlayerGui")
local screenGui = Instance.new("ScreenGui")screenGui.Name = "HUD"screenGui.ResetOnSpawn = false   -- keep GUI across respawnsscreenGui.ZIndexBehavior = Enum.ZIndexBehavior.SiblingscreenGui.Parent = playerGui

SurfaceGui

lua
local surfaceGui = Instance.new("SurfaceGui")surfaceGui.Face = Enum.NormalId.FrontsurfaceGui.SizingMode = Enum.SurfaceGuiSizingMode.PixelsPerStudsurfaceGui.PixelsPerStud = 50surfaceGui.Parent = workspace.ScreenPart
local label = Instance.new("TextLabel")label.Size = UDim2.fromScale(1, 1)label.Text = "Hello World"label.Parent = surfaceGui

BillboardGui

lua
local billboard = Instance.new("BillboardGui")billboard.Size = UDim2.fromOffset(200, 50)billboard.StudsOffset = Vector3.new(0, 2.5, 0)  -- float above headbillboard.AlwaysOnTop = falsebillboard.Parent = character:WaitForChild("Head")
local nameLabel = Instance.new("TextLabel")nameLabel.Size = UDim2.fromScale(1, 1)nameLabel.BackgroundTransparency = 1nameLabel.Text = player.DisplayNamenameLabel.Parent = billboard

UDim2 Sizing and Positioning

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

lua
frame.Size     = UDim2.new(1, 0, 0, 50)       -- full width, 50px tallframe.Position = UDim2.new(0, 0, 0, 0)         -- top-left corner
frame.Size     = UDim2.fromScale(0.6, 0.4)     -- 60% wide, 40% tallframe.Position = UDim2.new(0.2, 0, 0.3, 0)    -- centered (0.2 = (1-0.6)/2)
UDim2.fromScale(0.5, 0.5)    -- scale onlyUDim2.fromOffset(300, 150)   -- pixels only

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

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

Responsive Design

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

lua
button.Size     = UDim2.fromScale(0.2, 0.07)button.Position = UDim2.new(0.4, 0, 0.85, 0)
-- Prevent distortion with UIAspectRatioConstraintlocal arc = Instance.new("UIAspectRatioConstraint")arc.AspectRatio = 4   -- width:height = 4:1arc.Parent = button

TweenService Animations

lua
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 barlocal 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
lua
-- Safe pattern: wait for characterlocal player = game:GetService("Players").LocalPlayerlocal character = player.Character or player.CharacterAdded:Wait()local humanoid = character:WaitForChild("Humanoid")
humanoid.HealthChanged:Connect(function(health)    -- update health barend)

ResetOnSpawn

lua
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

Source and attribution

Source:sentinelcore/roblox-skillsinroblox-guiat commitf2b1910

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal