跳到正文
cccskills
免费在 GitHub 公开

roblox-ui

Build editable Roblox interfaces such as inventories, shops, and settings screens. Covers layouts for different screen sizes, touch and gamepad controls, animation, and respawn behavior, with emulator checks for clipping, navigation, and overlapping controls.

中文简介正在准备中。当前显示英语简介。

原文查看原文说明

Build production Roblox interfaces with ScreenGui/PlayerGui lifecycle, responsive UDim2 layouts, safe insets, reusable editable Instances, cross-device input and selection, restrained motion, cleanup, and multi-viewport verification. Use for Roblox HUDs, inventories, shops, settings, ability bars, ScrollingFrames, AutomaticSize, GuiService, gamepad focus, touch UI, or UI that clips, resets on respawn, looks generic, or was generated as one giant LocalScript.

集成工具X (Twitter)

实测评分 未实测

查看安装方法

适用场景

  • Building inventories and shop screens
  • Fixing clipped or overlapping mobile layouts
  • Adding touch and gamepad navigation
  • Fixing UI that disappears or duplicates after respawn

包含的文件(6)

  • SKILL.md12.4 KB
  • agents/openai.yaml190 B
  • assets/inventory-quality-test.model.json11.8 KB
  • assets/inventory-quality-test.project.json229 B
  • references/input-navigation.md4.7 KB
  • references/responsive-layout.md6.8 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Roblox UI

Implement deliberate, editable Roblox UI that preserves the experience's visual language and works across supported devices. Targets Roblox's rolling platform APIs. Pair with game-ui-ux for engine-neutral information architecture and UX; this skill owns Roblox Instances and APIs.

When to use

  • Use for authored ScreenGui interfaces, Roblox layout/constraint APIs, UI lifecycle, input, focus, animation, performance, or responsive/device fixes.
  • Use to replace brittle pixel layouts, runtime-created Instance tangles, mouse-only menus, or generic generated styling with a maintainable hierarchy.

When not to use: general UX flow and accessibility principles belong to game-ui-ux; raw gameplay action mapping belongs to input-systems; server trust belongs to roblox-networking.

Workflow

  1. Inspect before designing. In Explorer, inventory existing ScreenGuis, UI modules, fonts, colors, icon family, spacing, corners, strokes, animation timing, naming, and reusable components, including any StyleSheet/StyleLink styling, tokens and themes. Capture representative screenshots at two viewports. Extend that language.
  2. Define ownership and lifecycle. StarterGui is the authored template; Roblox clones it into each player's PlayerGui. Decide whether each ScreenGui should persist across respawn with ResetOnSpawn = false; never keep stale references to a destroyed clone.
  3. Author a readable hierarchy. Prefer meaningful editable Instances and small behavior modules. A normal screen should be understandable in Explorer; procedural generation is for genuinely data-driven repetition, not the whole shell.
  4. Build responsive structure. Combine UDim2 scale for placement with bounded offsets, correct AnchorPoints, layouts, padding, content sizing, and constraints. Choose explicit narrow/wide arrangements instead of shrinking a desktop panel until it technically fits.
  5. Handle platform obstructions. Keep interactive UI in CoreUISafeInsets (the recommended ScreenGui.ScreenInsets default), and account for touch controls and TV distance/overscan.
  6. Wire state and input. Render from a small view state; update on events. Use Activated for GuiButtons, explicit selected states, and reachable gamepad navigation. Bind non-widget actions with ContextActionService only while the screen owns them.
  7. Polish with restraint. Implement hover, pressed, selected, and disabled states. Animate state changes, not decoration; honor GuiService.ReducedMotionEnabled and clean up tweens and connections when the screen closes or is replaced.
  8. Verify the real interface. Use Device Simulator and Controller Emulator. Test desktop, narrow portrait, mobile landscape, tablet-like, and console/gamepad; then respawn. Record clipping, overlap, text, scroll, safe-area, focus path, touch target, and lifecycle results.

Production structure

StarterGui
└── InventoryGui (ScreenGui; ResetOnSpawn = false)
    ├── Root (Frame)
    │   ├── Header
    │   ├── Content
    │   │   ├── CategoryList
    │   │   ├── ItemGrid (ScrollingFrame)
    │   │   └── DetailsPanel
    │   └── Footer
    └── InventoryController (LocalScript)
ReplicatedStorage
└── UI
    ├── Components
    └── Theme

Names describe roles, not colors or temporary positions. Keep repeated item cells as templates or components, but keep the authored shell visible in Explorer.

Patterns

Layout that survives content and viewport changes

-- Authored properties on ItemGrid (ScrollingFrame):
--   AutomaticCanvasSize = Enum.AutomaticSize.Y
--   CanvasSize = UDim2.fromOffset(0, 0)
-- Children: UIPadding + UIGridLayout
local grid = itemGrid.UIGridLayout
local projectBreakpoint = 700 -- derive from where this composition stops being usable

local function applyComposition()
    local narrow = root.AbsoluteSize.X < projectBreakpoint
    categoryList.UIListLayout.FillDirection = if narrow
        then Enum.FillDirection.Horizontal
        else Enum.FillDirection.Vertical
    categoryList.Size = if narrow
        then UDim2.new(1, 0, 0, 40)
        else UDim2.new(0, 148, 1, 0)
    itemGrid.Position = if narrow then UDim2.fromOffset(0, 52) else UDim2.fromOffset(164, 0)
    itemGrid.Size = if narrow
        then UDim2.new(1, 0, 1, -52)
        else UDim2.new(0.58, -164, 1, 0)
    detailsPanel.Visible = not narrow -- open details as a separate narrow-screen state

    local width = itemGrid.AbsoluteSize.X
    local columns = if width < 520 then 2 elseif width < 820 then 3 else 4
    local gap = 12
    local usable = width - itemGrid.UIPadding.PaddingLeft.Offset
        - itemGrid.UIPadding.PaddingRight.Offset - gap * (columns - 1)
    grid.CellSize = UDim2.fromOffset(math.floor(usable / columns), 112)
    grid.CellPadding = UDim2.fromOffset(gap, gap)
end

root:GetPropertyChangedSignal("AbsoluteSize"):Connect(applyComposition)
applyComposition()

Use UIListLayout for one-dimensional flow, UIGridLayout for uniform cells, and UITableLayout only when row/column alignment is truly tabular. AutomaticSize fits content; AutomaticCanvasSize fits scroll content. Bound extremes with UISizeConstraint, UIAspectRatioConstraint, or UITextSizeConstraint rather than one global UIScale guess.

One activation path and explicit gamepad entry

local GuiService = game:GetService("GuiService")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")

local function usesDirectionalFocus(): boolean
    local preferred = UserInputService.PreferredInput
    return preferred == Enum.PreferredInput.Gamepad
        or preferred == Enum.PreferredInput.MicroGamepad
end

local function focusFirstItem()
    task.spawn(function()
        RunService.RenderStepped:Wait() -- selection must be rendered and selectable
        if root.Visible and usesDirectionalFocus() then
            GuiService.SelectedObject = firstItemButton
        end
    end)
end

local function openInventory()
    root.Visible = true
    focusFirstItem()
end

local function closeInventory()
    GuiService.SelectedObject = nil
    root.Visible = false
end

-- Owned by the screen lifecycle; disconnect on teardown.
local inputConnection = UserInputService:GetPropertyChangedSignal("PreferredInput"):Connect(function()
    if root.Visible and GuiService.SelectedObject == nil then focusFirstItem() end
end)

firstItemButton.Activated:Connect(function()
    selectItem(firstItemButton:GetAttribute("ItemId"))
end)

Decide input-dependent UI from UserInputService.PreferredInput, which follows the player's primary device; TouchEnabled/GamepadEnabled are capabilities (a touch laptop reports touch) and GetLastInputType() thrashes. Prefer Activated over separate mouse/touch handlers. Set NextSelectionUp/Down/Left/Right when automatic navigation is ambiguous, especially around grids, sidebars, and modals. A modal must trap focus inside itself and restore a sensible selection when it closes.

For cross-device action binding, the Input Action System (InputContext/InputAction/ InputBinding) is the modern edit-time layer; see references/input-navigation.md.

Inspect Roblox's default selection adornment in context. If it overwhelms the interface, assign a project-owned SelectionImageObject or selected-state treatment; keep it visible, valid, and restrained rather than disabling focus feedback.

State transition without animation noise

local TweenService = game:GetService("TweenService")
local GuiService = game:GetService("GuiService")
local fade = TweenInfo.new(0.14, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)

local function setPanelVisible(visible: boolean)
    panel.Visible = true -- panel is a CanvasGroup
    if GuiService.ReducedMotionEnabled then
        panel.GroupTransparency = if visible then 0 else 1
    else
        TweenService:Create(panel, fade, {
            GroupTransparency = if visible then 0 else 1,
        }):Play()
    end
    if not visible then
        task.delay(fade.Time, function()
            if panel.GroupTransparency == 1 then panel.Visible = false end
        end)
    end
end

Animate a panel or state boundary once. Do not independently bounce every descendant.

Visual quality gates

  • Establish hierarchy through size, weight, contrast, grouping, and whitespace before adding decoration. Use a small spacing scale and align to it.
  • Preserve the game's fonts, palette, icons, radii, and strokes. If the project uses UI styling, change tokens and StyleRules rather than per-instance properties; the Properties window marks styled properties with ⚠ and names the style on hover. If nothing exists, define a compact token set (a token StyleSheet or module); do not improvise per component.
  • Use corners where the material/form calls for them, not on every nested Frame. Avoid nested card-on-card shells, universal pills, arbitrary gradients/glows/shadows, neon outlines, excessive transparency/blur, oversized headings, meaningless icons, and huge empty panels.
  • Buttons with different importance should not look identical. Define primary, secondary, quiet, destructive, selected, pressed, hover, and disabled treatment only as needed.
  • Motion communicates open/close, focus, confirmation, or spatial relationship. Keep it short, interruptible, and subtle; avoid perpetual motion and decorative tween chains.
  • On touch devices, reserve the default movement/jump corners. Move or recompose bottom actions that overlap them, and show only the hints for the current PreferredInput.

Common failures

SymptomLikely causeRemedy
UI disappears or duplicates after respawnwrong ResetOnSpawn policy or stale clonechoose policy; reacquire from PlayerGui; clean old bindings
Phone layout clipsdesktop offsets/global scale used as layoutadd narrow composition, layouts, bounds, and Device Simulator checks
Content hidden under topbar/notchinsets ignored or ScreenInsets = Noneuse CoreUISafeInsets for interactive UI; inspect intentional bleed
Scroll ends earlyfixed CanvasSizeuse AutomaticCanvasSize or layout AbsoluteContentSize
Controller gets stuckno entry selection or bad neighbor graphset initial SelectedObject; define and test focus edges/modal trap
UI looks generateddecoration substituted for hierarchyremove effects; align, reduce nesting, fix density and component roles
Explorer contains only one scriptentire authored interface is proceduralauthor the shell as named Instances; generate repeated content only
Increasing connection/tween countscreen rebinds without cleanupown connections per screen lifecycle; disconnect/cancel on teardown

Resources

  • Read references/responsive-layout.md for layout decisions, inset policy, density, and the required viewport matrix.
  • Read references/input-navigation.md when implementing gamepad/touch focus, modal behavior, action binding, or motion preferences.
  • Build assets/inventory-quality-test.project.json with Rojo (it maps the adjacent JSON model) for an editable Instance fixture used in visual/layout review; it is a test baseline, not a style template for a shipping game.

Related skills

  • game-ui-ux — information hierarchy, screen flow, accessibility, and UX validation.
  • input-systems — gameplay action mapping and device switching.
  • roblox-networking — server-authoritative requests initiated by UI.
  • roblox-studio-workflow — Explorer-first editing and Studio verification.

Primary references

  • Roblox Creator Hub: https://create.roblox.com/docs/ui/on-screen-containers
  • Roblox Creator Hub: https://create.roblox.com/docs/ui/position-and-size
  • Roblox Creator Hub: https://create.roblox.com/docs/ui/size-modifiers
  • Roblox Creator Hub: https://create.roblox.com/docs/studio/testing-modes

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

Implement reusable decision systems for game characters using behavior trees, which organize conditional actions, and Utility AI, which scores available choices. Build either approach or combine them to control patrols, combat, targeting, and needs-based behavior.

中文简介正在准备中。当前显示英语简介。

  • Build a reusable behavior tree runtime
  • Choose attacks or targets using action scores
  • Combine patrol and combat trees with Utility AI
gamedev-skills/awesome-gamedev-agent-skills38832026年10月24日 更新

Design game audio with grouped volume controls, music that responds to gameplay, and varied sound effects. Plan how music lowers during dialogue and how events follow the beat, using principles that can be adapted to different game engines.

中文简介正在准备中。当前显示英语简介。

  • Plan grouped volume controls for music, effects, and dialogue
  • Lower background music while dialogue plays
  • Change music layers or segments with gameplay intensity
gamedev-skills/awesome-gamedev-agent-skills38832026年10月24日 更新

bevy-ecs

免费

Build and debug Rust games in Bevy using ECS, a way to separate game data from behavior. Organize apps and plugins, query entities, control execution order, and fix conflicting data access or frame-dependent movement.

中文简介正在准备中。当前显示英语简介。

  • Organizing a Bevy app with plugins
  • Defining components and shared resources
  • Fixing conflicting queries and execution order
gamedev-skills/awesome-gamedev-agent-skills38832026年10月24日 更新

Build and tune game cameras for smooth 2D following and 3D viewing. Covers motion smoothing, look-ahead, level boundaries, wall avoidance, and framing multiple targets, with techniques that apply across engines.

中文简介正在准备中。当前显示英语简介。

  • Smooth player-follow cameras in 2D games
  • Keep the camera view within level boundaries
  • Prevent third-person cameras from clipping through walls
gamedev-skills/awesome-gamedev-agent-skills38832026年10月24日 更新

card-game

免费

Design the core rules of a card game, including decks, hands, discards, drawing, shuffling, turns, and resource costs. Represent card effects as data and define their resolution order so card movement and gameplay outcomes follow explicit rules.

中文简介正在准备中。当前显示英语简介。

  • Building a deckbuilder or trading card game
  • Implementing draws and discard reshuffling
  • Defining turn phases and card costs
gamedev-skills/awesome-gamedev-agent-skills38832026年10月24日 更新

Plan and prepare consistent game artwork, from sprites and backgrounds to UI icons and 3D briefs. Organize asset requirements, generate or source related visuals, standardize files, and check their appearance and technical fit inside the game.

中文简介正在准备中。当前显示英语简介。

  • Create sprites and backgrounds with a consistent visual style
  • Check asset dimensions, transparency, and tile seams
  • Track asset sources and licenses before release
gamedev-skills/awesome-gamedev-agent-skills38832026年10月24日 更新

查看 gamedev-skills 的全部技能

报告此技能的问题