Was macht Roblox UI Maker?
LIZENZEN ZUERST. Icons stammen aus EINEM lizenzierten Icon-Paket, das du (der Entwickler) besitzt; dieser Skill liefert keine Icons und keine Texturen. Lies die Lizenz deines Pakets: Die meisten kostenpflichtigen Pakete erlauben die Nutzung in deinen eigenen Spielen, verbieten jedoch Weiterverkauf, Weiterverteilung, Asset-Pakete und KI-Training (falls ja, sende die PNGs des Pakets niemals an ein Bildmodell). In Spiel-Repos committe icons.json + das Kopierskript, nicht das Paket, es sei denn, die Lizenz erlaubt es. Texturen werden von dir von https://ui-resources.com heruntergeladen (UI_RESOURCES.md); gib die Urheber an.
Figma-Import-Tools sind für Designs, die bereits in Figma existieren; dieser Skill dient zum Entwerfen neuer UI (oder zum Nachbauen eines Screenshots) zuerst über HTML.
Der Kreislauf: Referenz -> Tokens -> HTML (alle Zustände) -> der Entwickler prüft -> lernen -> importieren -> verifizieren.
Lies LESSONS.md, bevor du irgendetwas anfasst (jede bisher gelernte Regel mit dem dahinterstehenden Bug). Sie hat Vorrang vor allem, was unten widerspricht.
Dateien in diesem Skill
| Datei | Zweck |
|---|---|
LESSONS.md | jede Regel + warum. Zuerst lesen; schreibe das Feedback des Entwicklers hier hinein (REVIEW_LOOP.md) |
STYLE.md | Referenz in Tokens einlesen; Voreinstellungen; CSS-Token -> Roblox-Tabelle |
UI_RESOURCES.md | ui-resources.com: was es ist, finden/herunterladen, die Stud-Textur und wohin damit |
PATTERNS.md | HUD, Shop, Crate-Rad + Quoten, Toasts, Bestätigung, Laden, Tutorial, Bubble, Ziel-Pille, Listen |
PIPELINE.md | HTML -> JSON -> Roblox im Detail: rbx.json, Export-Marker, Mapping-Tabelle, Ledger, Vorlagen, Kopien |
REVIEW_LOOP.md | Wie man Bildschirme zeigt, Feedback nimmt, Freigabe erhält |
VERIFY.md | Mock-Render, Property-Sweep, Edit-Mode-Harness, Playtest-Klicks, Checklisten |
ROBLOX_FACTS.md | Gemessene Engine- + MCP-Tool-Fakten (Inset, TextSize, Uploads, Captures) |
styles/ | stud.css (Standardvoreinstellung), glass.css (dunkle Simulator-Voreinstellung) |
templates/examples/ | Ein funktionierendes UI-Projekt: build.py, kit.css, icons.json, rx.json |
templates/luau/ | Builder, UIKit, NumberFormat, Theme, client/UI + Controller, Toasts, UpdateInPlace, PixelRows, ProgressiveReveal, NextGoal, CrateRoll, LoadingScreen, PropertySweep, WorldHitTest |
scripts/ | read_reference, copy_icons, cdp/export/dump, gen, ledger, assets, bundle, mock/mockshot/mockdiff, check_copies, luau_to_rbxmx; remake/ = 1:1-Messwerkzeuge |
SK=<Ordner dieses Skills> (der Ordner, in dem diese SKILL.md liegt). Benötigte Werkzeuge: python3 mit PIL + numpy, node 22+, Google Chrome (Headless-Rendering; env CHROME überschreibt den macOS-Pfad), luau-analyze, ein Browser-Panel oder Browser-Automatisierungswerkzeug zum Anzeigen von Seiten (in Claude Code Desktop: mcp__Claude_Browser__*, laden mit ToolSearch), ein Studio-MCP-Server, der Luau ausführen und .rbxmx-Dateien importieren kann (dieser Skill wurde gegen das Community-MCP robloxstudio geschrieben) und das integrierte Roblox_Studio-MCP nur für upload_image (ROBLOX_FACTS.md).
1. Briefing, Referenzen, Stil (erforderlich: eine Stil-Referenz)
- Hol dir das Briefing: welche Bildschirme, was sie tun, welche Daten sie anzeigen, PC + Handy. Liste alle Zustände auf, die jeder benötigt.
- Ein Stil-Referenzbild ist erforderlich. Verwende das vom Entwickler gegebene. Falls keins: frage einmal („Sende einen Screenshot des gewünschten Stils; oder ich verwende den Stud-Stil“). Wenn sie sagen, mach einfach: Stud-Voreinstellung. Die meisten Spiele sind Stud.
- Führe zuerst die Projekteinrichtung in Schritt 4 durch (er erstellt
ui/), speichere dann die Referenz alsui/ref.png. Layout-Referenzen (ein anderer Shop) sind getrennt von der STIL-Referenz. - Lies sie aus
ui/heraus ein (STYLE.md Abschnitt 2):python3 $SK/scripts/read_reference.py ref.png-> Palette, Umriss-Px, Textur-Hinweis, Text-Stil, Dichte +ref_palette.png,ref_zoom.png(Lies es, um Studs/Glanz zu SEHEN) und einen Entwurf vonstyle.css. Bestätige jeden Wert visuell, behalte nur Überschreibungen der gewählten Voreinstellung. - „Wie Spiel X“ = inspiriert, keine Kopie, es sei denn, der Entwickler sagt „baue das 1:1 nach“ (dann LESSONS Abschnitt 7 und
scripts/remake/).
2. Texturen von ui-resources.com
Der Stud-Stil MUSS eine Stud-Textur tragen. Dieser Skill bündelt keine: Lade die ui-resources „Stud texture“ (Tag Stud) selbst von https://ui-resources.com herunter, konvertiere sie bei Bedarf in ein echtes PNG und speichere sie als ui/stud.png in deinem Projekt (4×4 Studs pro Kachel, gekachelt bei 112 px mit Overlay-Blend-Modus). Für alles andere (Papier, Sonnenstrahlen, Halbtöne, Hintergründe) durchsuche zuerst die Website und speichere Downloads in ui/tex/ (UI_RESOURCES.md: Filter, ?tag=Stud, Lesen von Lazy-Loading-URLs, file + sips für WebP-namens-PNG). Gib die Urheber im Header von build.py an.
3. Icons: nur dein Icon-Paket
Icons stammen aus EINEM lizenzierten Vektor-Icon-Paket, das der Entwickler besitzt (ein Vektor-Paket pro Projekt; niemals Pakete mischen), niemals Emojis. Finde Icons, indem du den eigenen Ordner oder Katalog des Pakets durchsuchst (z. B. find <paket> -iname '*coin*'). Bearbeite nach der Einrichtung in Schritt 4 ui/icons.json ({"slug": "Icon-Dateiname oder Pfad im Paket"}; die Beispiel-Liste ist ein Ausgangspunkt) und führe python3 $SK/scripts/copy_icons.py icons.json --pack <dein Icon-Paket> in ui/ aus (füge --prefer " Outline" oder das Äquivalent für dein Paket hinzu, um zuerst Umriss-Varianten zu nehmen). Niemals Emojis, Schließen = Text „X“. Suche Synonyme, bevor du etwas als fehlend bezeichnest.
4. Jeden Bildschirm in HTML/CSS bauen
Einmal im Spiel-Repo einrichten (mache dies, bevor Schritte 1-3 etwas in ui/ schreiben; cp -n überschreibt nie):
mkdir -p ui && cp -rn $SK/templates/examples/. ui/ && cd ui
cp <deine heruntergeladene Stud-Textur> stud.png && cp -r $SK/styles . # Stud-Textur von ui-resources.com
cp <Referenz> ref.png && python3 $SK/scripts/read_reference.py ref.png # -> style.css (Entwurf)
python3 $SK/scripts/copy_icons.py icons.json --pack <dein Icon-Paket> && python3 build.py # -> *.html + index.html
python3 -m http.server 8870 --bind 127.0.0.1 # run_in_background; oder den launch.json-Eintrag unten + preview_start
.claude/launch.json im Spiel-Repo (dann mcp__Claude_Browser__preview_start {name: "ui"}):
{ "version": "0.0.1", "configurations": [
{ "name": "ui", "runtimeExecutable": "python3",
"runtimeArgs": ["-m", "http.server", "8870", "--bind", "127.0.0.1", "--directory", "ui"], "port": 8870 } ] }
Bearbeite build.py (es ist die Quelle der Wahrheit; bearbeite niemals generierte .html-Dateien von Hand). Die wichtigsten Regeln:
- 1920×1080-Bühne, absolute px; gemeinsame Komponenten (
plate,panel,card,T,I), sodass Geschwister eine Behandlung teilen; nur Farben variieren. Styling kommt von Tokens:kit.css(Struktur) ->styles/<voreinstellung>.css(UI_STYLE=glass python3 build.pyzum Wechseln) ->style.css(dieses Spiel).?style=glasszeigt Vorschau live. - Export-Marker:
grp(name, html, anchor)= ein Roblox-Frame auf oberster Ebene, verankert an einem Bildschirmrand;name=auf jedem Live-Label/Icon/Button;sub(..., btn=True, opens='Shop');hid=Truefür exportierte, aber verborgene Zustände. PIPELINE.md Abschnitt 2 hat die vollständige Tabelle. - Alle Zustände auf
states.html; Handy-Layout (hud_phone.html); jedes Laufzeitelement (Toasts, Bestätigung, Belohnung, Tutorial, Billboards) auftemplates.html; zeige Teile im Kontext über einem echten Spiel-Capture, sobald eines existiert. - Keine doppelten Anführungszeichen in inline
style="..."; kein Element namens Active/Visible/Position...; verwendehid(Deckkraft 0), niemalsdisplay:none, für Dinge, die das Spiel umschaltet. - Selbstprüfung: Öffne jede Seite mit
?checkim Browser-Panel (checkOverflow()muss keine Überläufe und keine kaputten Bilder zurückgeben); erstelle 2 Headless-Aufnahmen (REVIEW_LOOP.md) und betrachte sie.
5. Stopp: Der Entwickler prüft es
Zeige style.html + den ersten Bildschirm in der ersten Runde, dann den Rest (REVIEW_LOOP.md). Warte auf ein explizites Ja. Jede Korrektur: finde die allgemeine Regel, schreibe sie in LESSONS.md (Regel, dann warum), wende sie überall an, teile dem Entwickler in einem Satz mit, was du gespeichert hast. Keine Roblox-Arbeit vor der Freigabe.
6. In Roblox importieren (nach Freigabe)
Vollständige Details: PIPELINE.md. Aus ui/ mit laufendem Server:
# nur beim ersten Import: die Luau-Laufzeit + Builder (dann ersetze "<Gui>" in ../roblox/ui/client/UI.luau mit rbx.json "gui")
mkdir -p ../roblox/ui/client && cp -n $SK/templates/luau/*.luau ../roblox/ui/ && cp -n $SK/templates/luau/client/*.luau ../roblox/ui/client/
rm -f ../roblox/ui/LoadingScreen.client.luau ../roblox/ui/CrateRoll.luau # diese leben in ReplicatedFirst / ReplicatedStorage
node $SK/scripts/export.mjs # Layout-JSON + 2 transparente PNGs pro Raster-Teil -> rbx/out/
python3 $SK/scripts/gen.py # Data_<Screen>.luau, Data_Templates, Data_Manifest -> luau_out; art -> rbx/out/upload
python3 $SK/scripts/mock.py && node $SK/scripts/mockshot.mjs # Offline-Roblox-Semantik-Render: mittlere Differenz 1-3 pro Bildschirm
python3 $SK/scripts/ledger.py 20 # nächste hochzuladende URLs; hochladen mit mcp__Roblox_Studio__upload_image(+studio_id),
# dann: echo '<result json>' | python3 $SK/scripts/ledger.py 20 ; wiederholen bis 0 übrig
python3 $SK/scripts/assets.py # AssetIds.luau
python3 $SK/scripts/bundle.py # rbx/out/<Gui>Build.rbxmx
Hochladeregeln: <= 20 pro Stapel, öffne den Platz der GRUPPE, wenn das Spiel der Gruppe gehört, lade nie erneut hoch, was der Ledger hat, überprüfe fremde IDs. Dann in Studio über robloxstudio:
zerstöre den alten ServerStorage.<Gui>Build -> import_rbxm der .rbxmx in ServerStorage ->
require(game.ServerStorage.<Gui>Build.Builder).build() -> aktiviere das Gui, Builder.fit() zweimal, deaktiviere.
Niemals set_script_source (verunstaltet \n); immer .rbxmx + import_rbxm.
Verdrahte den Spielcode (der Controller startet UI + UIKit; Demo-Zahlen nur mit dem Gui-Attribut PreviewMode):
client/UI.luau (öffnen/schließen/zurück, saftige Buttons mit Button/Opens-Attributen, Escape,
Scrim, Popup-Queue, Count-ups) + UIKit.luau (Template-Vertrag: klonen, set mit Shadow-Zwillingen, Icons, Balken,
Plural/Artikel, worldLabel) + NumberFormat.luau. Spielcode klont Vorlagen; er baut nie ein Aussehen mit Instance.new. Protokolliere jede Laufzeitänderung an importierten Bildschirmen (PIPELINE.md Abschnitt 8).
7. In Studio verifizieren
VERIFY.md, in der Reihenfolge: keine leeren Bilder; Passungsverhältnisse; PropertySweep.atSizes bei 1920×1080 / 1366×768 / 844×390; den Edit-Mode-Harness (klone das Gui, require das Klon-UI, treibe es, UI.destroy(), Archivable=false); Playtest nur bei Bedarf (prüfe, dass kein anderer Playtest läuft): ein Magenta-Capture ist KEINE kaputte UI; echte Klicks bei AbsolutePosition + size/2 +58 px; Handy-Geräteprofil; Schnellklick-Test; Listen aktualisieren in place. luau-analyze --mode=nonstrict für jede Client-Datei; check_copies.py, damit Studio-Kopien mit der Festplatte übereinstimmen.
8. Iterieren
Neues Feedback -> LESSONS.md -> HTML -> Freigabe -> nur die geänderte Seite exportieren -> gen -> Ledger lädt nur neue Kunst hoch -> bundle -> Builder.buildScreen("<Screen>") (ein Panel an Ort und Stelle) oder build() -> fit -> verifizieren.
Niemals
Emojis oder ein zweites Icon-Paket; KI-generierte Icons; Icon-Paket-Dateien, die an ein Modell gesendet werden, wenn die Lizenz die KI-Nutzung verbietet; in Bilder eingebackener Text; Import vor Freigabe; manuelles Bearbeiten von Data_*.luau; set_script_source; Demo-Werte, die geschrieben werden, während der echte Spiel-Client läuft; automatisch eingeforderte Belohnungen; eine Linie oder ein Marker, der über einem Preis gezeichnet wird; spielspezifische IDs oder Namen innerhalb dieses Skill-Ordners.