Rapheal RobinsonSite Reliability Engineer & Game Developer

← Blog & Chat

design takeaway

Build UI from a few components, not one-off screens

How I learned UI over eight years, from hand-placed screens to a component system with declared states.

Part of Arcana

UI is one of the top reasons a game thrives or fails. Players forgive a lot, but not a menu that fights them. It took me years to learn to build it well.

2018 to 2022: every screen by hand

At first every window was its own code. Each tooltip, panel and button was positioned and styled where it was used. My commits from then are full of one-off fixes: UI scale, HP bar scaling, tooltip after tooltip. Changing how buttons looked meant finding every button.

2023: the first components

In April 2023 I pulled shared pieces out into components and fixed GUI scaling and positioning across the whole client in one pass. Screens started to look like they belonged to the same game.

2025: everything replicable

In November 2025 I committed to “everything is replicable”. One Button class with an IButtonComponent interface is the base for every button, and variants like the close button are small overrides. A factory hands out the common pieces: backgrounds, headers, buttons, line breaks. A screen becomes a list of steps, each about two lines of code:

addContainer();
addClose();
addName();
addScrollableContainer();
addRewards();
addPurchaseButton();

It wasn’t pretty, but it worked, and every new screen came out consistent.

2026: a real system, with an artist

In September 2026 I spent 20 days redesigning the whole UI infrastructure, with new art from afentis:

A button in its normal, hover, pressed, disabled and selected states
A number stepper at normal, at its minimum, at its maximum, and disabled
A window in its normal and dragging states

Arcana’s client now has 157 UI component files, a sheet that renders every state of every component, written rules for text sizes and colours, and a lint tool that checks screens against those rules.

What I’d tell myself in 2018

I use the same idea in the launcher and the websites.

Comments

    Your email is never shown or shared. It's only used to email you when someone replies, after you confirm it, and every email has a link to stop them. To prevent spam, the server keeps your IP address and a random ID saved in this browser.