Plan the player task first
Define the decision the screen supports before choosing colors or effects. A good GUI makes the next action and the current state easy to understand.
List the information the player needs, the actions they can take, and the states that can occur. A purchase panel, for example, needs an item identity, price, affordability state, purchase action, feedback, and a way to leave.
Build a clear object hierarchy
Use a ScreenGui as the on-screen root, Frames for regions, labels for information, and buttons for actions. Nest related objects together so the Explorer hierarchy matches the visual design.
- ScreenGui: the root container rendered for a player.
- Frame and ScrollingFrame: panels, groups, lists, and scrollable regions.
- TextLabel and ImageLabel: non-interactive information and artwork.
- TextButton and ImageButton: controls that receive player input.
- UIListLayout, UIGridLayout, UIPadding, and size constraints: repeatable alignment and spacing.
Design for different screens
Combine scale-based sizing with sensible offsets and constraints. Test the interface at narrow phone ratios and wide desktop ratios instead of assuming one canvas size.
AnchorPoint controls which part of an object its Position refers to. UIScale can resize a subtree, while UIAspectRatioConstraint preserves a shape. AutomaticSize and layout objects are useful for content-driven panels, but each needs testing with long text and localization.
Add behavior without trusting the client
LocalScripts should handle presentation and input, while the server validates purchases, rewards, inventory changes, and other authoritative game state.
A button click can request an action through a RemoteEvent or RemoteFunction. The server must independently verify that the player is allowed to perform it. The interface should then display the confirmed result rather than granting value locally.
Test states, input methods, and failure paths
Test with mouse, touch, and gamepad where your experience supports them. Also test loading, empty, disabled, error, and repeated-click states.

