Design the layout.
Keep the native UI.
A Figma frame can become a Godot container. A button component can become a real Button. Here’s how to prepare your design so the result behaves the way you expect.
Start with the Quick start to add GUIRelay to your Godot project, find the Figma plugin, and link the two apps.
What becomes what
Use familiar Figma features. GUIRelay turns them into Godot’s native layout and control system.
| In Figma | In Godot |
|---|---|
| Horizontal / vertical auto-layout | HBoxContainer / VBoxContainer |
| Fill, hug, fixed sizes & constraints | Size flags, minimum sizes & anchors |
| Button, Toggle, Checkbox, Slider | Native interactive controls |
| Input, Dropdown, Progress | Inputs, options & progress bars |
| Color modes & component styles | Reusable Theme resources |
| Vector & image layers | Imported image assets |
Name your components for the control you want. The plugin’s layer tree shows what each layer becomes, and its control picker lets you adjust the mapping.
Use Dark and Light color modes for theme variations, editable icons for your visual style, and component variants for control states.
Layouts
Use auto-layout for menus, toolbars, cards, and other UI that should resize with its content. GUIRelay translates the layout rules into native containers instead of flattening the whole screen into an image.
Menu · vertical auto-layout Padding 24 · gap 12 ├─ Title · text ├─ Play · Button instance └─ Settings · Button instance
Menu · PanelContainer └─ Layout · VBoxContainer ├─ Title · Label ├─ Play · Button └─ Settings · Button
| Design in Figma | Imported result |
|---|---|
| Horizontal / vertical auto-layout | HBoxContainer / VBoxContainer |
| Wrapping auto-layout | HFlowContainer / VFlowContainer |
| Gap between children | Container separation |
| Padding or a styled auto-layout frame | A PanelContainer around the layout container |
| Space between | Expanding spacer nodes between children |
| A frame without auto-layout | Panel or Control, with positioned children |
| Prototype overflow scrolling | ScrollContainer around the content |
For a HUD, start with constraints
Use a screen-sized frame without auto-layout. Pin a health group to the top-left and an ammo group to the bottom-right using Figma constraints. Each group can still use auto-layout inside. Leave the screen’s background empty when your game world should show through.
Sizing & constraints
Inside auto-layout, the parent container controls placement. Outside auto-layout, Figma’s constraints determine anchors and offsets.
| Figma setting | Godot behavior |
|---|---|
| Fill container | Expands and fills on the layout’s main axis; fills available space on the cross axis. |
| Hug contents | Uses the control or container’s content minimum instead of forcing the Figma dimensions. |
| Fixed | Uses the Figma dimension as a custom minimum size. Content can still require more room. |
| Left / right / top / bottom | Anchors to the corresponding parent edge, preserving offsets. |
| Center / stretch / scale | Centered anchors, opposing-edge anchors, or proportional anchors. |
Try this: give a vertical menu fixed width and hug height, then set its buttons to fill width. The container stacks them, the buttons span the menu, and the text supplies their content minimum. Check the result at your game’s target window sizes.
Scrollable lists
Set overflow scrolling on the viewport frame in Figma’s Prototype panel. Keep the list content inside it. To style the native scrollbar, add a track-and-thumb layer named Scrollbar inside that frame and keep it out of the scrolling auto-layout flow. It becomes scrollbar styling rather than an extra imported decoration.
Component names
For component instances, GUIRelay checks the component set and main component names. A whole name, or one segment separated by /, must match a supported control name. Matching ignores case, spaces, and punctuation within a segment.
ButtonButton / PrimaryGame / ButtonEach can resolve to a native Button.PrimaryButtonCTAPlay actionChoose a control explicitly or rename the component.A normal frame called “Button” isn’t automatically a button. Renaming a placed instance alone also doesn’t change its source component name. Use a component instance for name detection, or assign a control with the picker.
You can always choose the mapping
- One layer: select it in the plugin’s Screens tree and choose a control in the inspector.
- A reusable component: open Controls in the Figma plugin and set its type for the component’s instances.
- A Godot project: use the dock’s Components mapping to assign a type without renaming the Figma component.
The import resolves a Figma control assignment first, then the Godot project mapping, then the component name. Choose Plain to keep ordinary layout instead of a native control. Auto clears the local assignment; a component-level assignment can still apply.
Inspect the layer’s reported type after pushing. If a name-matched component contains too many extra parts, GUIRelay keeps it as ordinary layout to avoid discarding the design. Simplify it or deliberately set the control type; forcing a native control can leave unsupported children out.
States & values
Use State for interaction looks. Status and Interaction are also recognized property names. A single-variant component still imports, but separate state designs give you control over its hover and pressed appearance.
| Property & values | How it is used |
|---|---|
StateDefault, Hover, Pressed, Disabled, Focus | Supplies the native control’s state styling. Default is the normal look. |
CheckedTrue, False | Sets the initial checked value for a checkbox or switch. |
ValueOn, Off | Another supported way to describe a switch or checkbox’s on/off value. |
SelectedTrue, False | Sets the initially selected radio option. |
Value0, 25, 50, 100 | Keeps range-value variants in the same theme variation. For sliders and progress bars, the drawn fill determines the actual value. |
The placed variant matters. A button instance placed in State=Disabled starts disabled. One placed in State=Pressed becomes a toggle button that starts pressed—useful for a selected slot. Place Default for an ordinary action button, even when the component set includes a Pressed look.
Boolean values are interpreted with their property name: Checked=True means checked, while Icon=True does not. Keep style choices such as primary/secondary separate from state and value properties.
Native controls
These are the currently recognized names and the structure each control expects. Aliases in the same row produce the same Godot type.
Button
ButtonOne text layer and an optional icon before or after it. The frame supplies the background, border, corner radius, and padding.
Toggle · Switch · CheckButton
CheckButtonA label followed by a switch track and knob. Use an on/off property for the checked state.
Checkbox
CheckBoxA box and check mark before the label. Keep the box and mark as separate layers.
Radio · RadioButton
CheckBox + ButtonGroupA circle and selected dot before the label. Group related options in a frame named RadioGroup or RadioGroup / Difficulty.
Slider · HSlider
HSliderA horizontal track, a fill starting at the same edge, and a round thumb. The fill width determines the starting value.
Progress · ProgressBar
ProgressBarA track or background frame and a fill starting at the same edge. The fill width determines the starting value.
Dropdown · Select · ComboBox · OptionButton
OptionButtonA selected-value text layer and an optional chevron after it. The import creates one selected item; add the rest of the options in Godot.
Input · InputField · TextField · TextInput · LineEdit
LineEditThe text layer becomes placeholder text, not an entered value. An optional icon on the right is supported.
Switches, checkboxes & radio groups
Simple solid tracks, boxes, circles, knobs, and marks can animate as native indicators. Keep those parts separate. More complex artwork can fall back to rasterized state images while the control remains interactive.
Radio buttons share a group inside their nearest RadioGroup frame. Without that frame, sibling radios share a group. Each instance of the imported scene gets its own group.
Themes, fonts & artwork
Color modes become theme alternatives
Use Figma color variables and modes for palettes such as Light and Dark. GUIRelay generates Godot Theme resources for the design system, with alternatives for its color modes. Component styles become reusable theme variations; imported defaults can also style native controls you add in Godot. Switching themes during play is part of your game logic.
Put the fonts in your Godot project
Include the font files your design uses. GUIRelay matches fonts by name, including static and variable fonts. A system-font fallback may look correct on your computer; use project font files for a packaged game and check missing-font import notes. Custom line height and letter spacing aren’t carried over yet.
Keep artwork separate from layout
Vectors, icons, image fills, and complex leaf artwork can be rendered as 2× PNG assets and imported as TextureRect nodes. Native controls absorb supported icons into their own icon properties. Keep editable text and layout outside flattened artwork when you want them to remain native.
Before you push
A few Figma features don’t have a complete native translation yet. Design with these current limits in mind:
- Absolute children inside auto-layout enter the container’s flow. Use a separate non-auto-layout parent for overlays.
- Grid layout uses fixed positions; it doesn’t become a responsive Godot grid. Wrapping layouts don’t preserve space-between packing.
- Gradients behind child layers, blend modes, inner shadows, and slider-thumb shadows aren’t fully reproduced. Simplify the style or keep decorative artwork separate.
- Number variables, native tab controls, and vertical sliders aren’t supported by the current import.
A useful first-pass check
- Push one screen and read its import notes.
- Check the detected control types and any components kept as ordinary layout.
- Run the scene, resize it, and try hover, focus, pressed, and checked states.
- Add scripts and custom nodes in an inherited scene, then change the Figma design and push again.