Your First Unity 6 Input System Glyph Table for Steam Deck Fest Demos in One Evening - 2026
Your fest demo shows Press E to interact on screen. The player on Steam Deck sees a keyboard E while holding a controller. They mash A because your UI still maps interact to the wrong glyph sprite. The reviewer writes controls confusing—not because your game is hard, because you never built a glyph table tied to Input System binding paths.
Autumn 2026 brings another wave of Steam Deck Verified retests and October Next Fest installs on handheld-first hardware. Input System 1.14 package churn (on Unity 6 lines) breaks sample glyph assets teams copied in spring. This Tutorials & Beginner-First pipeline is your first evening wiring one lookup table for fest demo scope—not the full ninety-minute rebinding preflight you run before a Verified resubmit.
Pair with Wednesday demo smoke, BUILD_RECEIPT, and 16 Deck glyph tools.
Non-repetition note: The preflight guide owns rebinding JSON + Steam Input manifest parity. This URL owns your first glyph_table_v1.json for a short fest demo.
Who this is for and what you get
| Audience | Outcome |
|---|---|
| First Unity 6 + Input System fest shipper | One JSON glyph map + UI hookup pattern |
| Designer | List of which prompts appear in demo hour-one |
| Producer | unity_glyph_table_receipt_v1.json before promotion |
Time: 3–4 hours first pass; 45 minutes when reusing template.
Prerequisites: Unity 6 project with Input System package installed, PlayerInput or InputActionAsset in demo scene, Windows PC build for tonight (Deck hardware optional until Gate U3).
Why this matters now (Autumn 2026)
- Input System 1.14 churn — Binding path strings and default control schemes shifted; hard-coded
"A"sprites lie. - Fest demo hour-one — Reviewers judge controls in minutes; wrong glyphs read as broken ports.
- Deck resolution — 1280×800 and scaling expose tiny prompt art; pixel font pass does not replace controller icons.
- Scope discipline — Fest demos need Move / Jump / Interact / Pause—not twenty rebinding rows.
- Evidence pairing — Playtest isolation requires fest builds to show correct
build_labeland honest prompts.
Direct answer: Inventory demo actions → build glyph_table_v1.json keyed by binding path → wire UI lookup → pass gates U1–U5 → file receipt before branch promotion.
What you will have after one evening
glyph_table_v1.jsoninAssets/Resources/or AddressablesGlyphPromptUI.cs(or equivalent) reading the table- Screenshot proof at 1280×800 windowed
unity_glyph_table_receipt_v1.jsoninrelease-evidence/unity/input/build_labelon title matching BUILD_RECEIPT
Evening timeline
| Block | Minutes | Output |
|---|---|---|
| 1 — Action inventory | 30 | Demo action list |
| 2 — Glyph table JSON | 45 | glyph_table_v1.json |
| 3 — UI wiring | 60 | Prompts swap with device |
| 4 — U1–U3 tests | 45 | PC keyboard + controller |
| 5 — Receipt | 30 | JSON signed |
Mental model — three layers beginners confuse
| Layer | What it is | Tonight |
|---|---|---|
| InputAction | Logical action (Interact) |
List demo actions only |
| Binding | Path (<Gamepad>/buttonSouth) |
Key for glyph lookup |
| Glyph sprite | PNG shown in UI | One per binding path per scheme |
Steam Input and rebinding save files are out of scope tonight—see preflight guide when you add remapping menus.
Step 1 — Fest demo action inventory (Gate U1)
Open your demo InputActionAsset. Export only actions reachable in fest hour-one:
| Action | Used in demo? | UI prompt? |
|---|---|---|
| Move | Yes | Optional stick hint |
| Jump | Yes | Yes |
| Interact | Yes | Yes |
| Attack | Maybe | Only if hour-one combat |
| Pause | Yes | Menu only |
| Debug | No | Strip from fest build |
Pass U1: Written list in docs/demo_input_scope.md; no debug actions bound in fest scene.
Disable or #if !FEST_DEMO wrap actions outside scope—matches vertical slice honesty.
Step 2 — glyph_table_v1.json (Gate U2)
Store the table where your build can load it at runtime:
| Location | Pros |
|---|---|
StreamingAssets/ |
Easy path on disk; good for receipts |
Resources/ |
Simple Resources.Load |
| Addressables | Better for DLC—overkill for fest demo |
Create Assets/StreamingAssets/glyph_table_v1.json (or Resources):
{
"schema": "glyph_table_v1",
"project_version": "0.8.0-fest",
"entries": [
{
"action": "Player/Interact",
"binding_path": "<Gamepad>/buttonSouth",
"glyph_id": "xbox_a",
"sprite_address": "Glyphs/xbox_a"
},
{
"action": "Player/Interact",
"binding_path": "<Keyboard>/e",
"glyph_id": "key_e",
"sprite_address": "Glyphs/key_e"
},
{
"action": "Player/Jump",
"binding_path": "<Gamepad>/buttonSouth",
"glyph_id": "xbox_a",
"sprite_address": "Glyphs/xbox_a"
},
{
"action": "Player/Jump",
"binding_path": "<Keyboard>/space",
"glyph_id": "key_space",
"sprite_address": "Glyphs/key_space"
}
],
"fallback_glyph_id": "glyph_unknown"
}
Rules:
- One row per action + binding path pair—not per action alone.
- Use binding path strings from Input System debugger (see Step 3).
- Include keyboard rows for PC fest players even when targeting Deck.
Pass U2: Every prompted action has ≥1 row; sprites exist at sprite_address.
Sprite sheet discipline
| Do | Avoid |
|---|---|
| 64×64 source glyphs, downscaled in UI | Blurry 512px shrunk in prompt |
| Consistent stroke width | Mixing Xbox and PS glyphs in one prompt |
glyph_unknown placeholder |
Empty Image component |
Use 16 Deck tools listicle for asset packs; tonight you only need five to eight sprites.
Install and enable Input System (if not done)
| Step | Action |
|---|---|
| 1 | Window → Package Manager → Input System → Install |
| 2 | Restart when Unity prompts to enable new backend |
| 3 | Create Input Actions asset via Create → Input Actions |
| 4 | Add PlayerInput to player prefab; assign asset |
| 5 | Generate C# Class optional—table JSON stays data-driven |
Pin package version in Packages/manifest.json and log it in receipt (input_system_package).
Outbound: Unity Input System documentation for binding path syntax on your lockfile.
Step 3 — Wire UI lookup (beginner C# pattern)
Minimal read-only pattern (adapt names):
// Pseudocode — align to your UI toolkit (UGUI / UI Toolkit)
string path = playerInput.actions["Interact"].GetBindingForControl(activeControl).effectivePath;
GlyphEntry e = GlyphTable.Load().Find(path) ?? GlyphTable.Fallback;
promptImage.sprite = Resources.Load<Sprite>(e.sprite_address);
Debug tip: Log effectivePath to console when prompts wrong—compare to JSON keys.
Pass U2 extension: Changing active control scheme (keyboard vs gamepad) swaps sprite without scene reload.
Gate U3 — 1280×800 prompt proof
- Build Windows player.
- Set resolution 1280×800 borderless (Deck native).
- Screenshot each prompt: Interact, Jump, Pause.
- Optional: test on Deck hardware if available.
Fail: Text says E while sprite shows A.
Save as release-evidence/unity/input/U3_1280x800_interact.png.
U1 deep dive — demo scope document
docs/demo_input_scope.md template:
# Fest demo input scope — frozen 2026-05-24
## In scope (hour-one)
- Move, Jump, Interact, Pause
## Out of scope (strip or #if FEST_DEMO)
- DebugFly, DevConsole, PhotoMode, FullGameMap
## UI prompts visible
- Interact (door), Jump (tutorial once), Pause (menu)
## build_label
- unity-fest-2026-05-24-rc1
Producer signs scope doc before engineering freezes glyph_table_v1.json.
U2 deep dive — binding path discovery
- Enter Play Mode with Input Debugger (Window → Analysis → Input Debugger).
- Select Player → Interact → note effective path for gamepad and keyboard.
- Copy paths exactly—including
<and>brackets. - Add rows for composite bindings only if UI shows one prompt (don't split D-pad composites for a single "Move" hint unless you display move).
| Debugger shows | JSON binding_path |
|---|---|
<Gamepad>/buttonSouth |
same string |
<Keyboard>/e |
same string |
Composite pitfall: Move may list four bindings; UI usually shows one stick glyph—pick one representative path or use a dedicated Move hint row with glyph_stick_l.
UI Toolkit variant (UGUI alternative)
For UI Toolkit, store glyph_id in USS class or VisualElement style background:
var path = action.GetBindingForControl(control).effectivePath;
var entry = GlyphTable.Find(path);
promptVE.style.backgroundImage = new StyleBackground(entry.LoadSprite());
Same JSON—different renderer. Document which UI stack you use in receipt.
Gate U4 — PC keyboard lane
Fest traffic is not 100% Deck. Verify keyboard rows:
- Interact prompt shows E sprite when keyboard bound
- Movement tutorial does not show gamepad-only glyphs on first launch
Gate U5 — Receipt and BUILD_RECEIPT
unity_glyph_table_receipt_v1.json:
{
"schema": "unity_glyph_table_receipt_v1",
"build_label": "unity-fest-2026-05-24-rc1",
"input_system_package": "1.14.x",
"glyph_table_path": "StreamingAssets/glyph_table_v1.json",
"gates": {
"U1_demo_scope": true,
"U2_table_complete": true,
"U3_1280x800_proof": true,
"U4_keyboard_lane": true,
"U5_build_label_match": true
},
"pass": true,
"signed_at": "2026-05-24T23:00:00Z"
}
Add BUILD_RECEIPT column: glyph_table_pass=Y.
Proof folder layout
release-evidence/unity/input/
glyph_table_v1.json # copy of shipped file
unity_glyph_table_receipt_v1.json
U3_1280x800_interact.png
U3_1280x800_jump.png
U4_keyboard_interact.png
binding_path_dump.txt
demo_input_scope.md
Attach folder path to partner ZIP when publishers ask about Deck readiness.
Gate U3 on real Steam Deck (optional same evening)
If hardware available:
- Install fest build from Steam or playtest branch per isolation playbook.
- Photo prompts with phone if capture card unavailable.
- Log
build_labelin receipt notes.
No hardware? 1280×800 windowed on PC is minimum bar tonight.
Troubleshooting table
| Symptom | Likely cause | Fix |
|---|---|---|
| Always keyboard glyph | PlayerInput default scheme keyboard |
Switch scheme in test; read active control |
| Blank prompt | Missing JSON row | Add path from debugger |
| Wrong face button | Path typo buttonEast vs buttonSouth |
Fix row |
| Prompt never updates | UI not subscribed to control change | Hook onControlsChanged |
| Double prompts | Two UI scripts | One prefab only |
Comparison — this pipeline vs rebinding preflight
| Topic | This beginner pipeline | Preflight guide |
|---|---|---|
| Time | One evening | ~90 min specialized |
| Scope | Fest demo prompts | Verified resubmit |
| Rebinding UI | Out of scope | In scope |
| Steam Input manifest | Out of scope | In scope |
| Output | glyph_table_v1.json |
Full preflight receipt |
Pairing with fest operations
| Ritual | Pairing |
|---|---|
| Metadata diff | Note glyph_table hash if store mentions Deck |
| Save-slot case study | Same build_label on title and receipt |
| Refund dashboard | Tag controls separately from gameplay |
Workshop script (team of three, 50 minutes)
| Role | Task |
|---|---|
| Designer | Export glyph PNGs + naming convention |
| Programmer | Debugger path dump + UI hookup |
| Producer | Scope doc sign-off + receipt |
PlayerInput vs InputUser (note)
Unity 6 samples differ. If using InputUser multiplayer API, dump paths per user—fest single-player demos usually use PlayerInput only. Document which API in demo_input_scope.md.
Accessibility
- Do not rely on color alone in prompts—shape + label.
- Optional text label beside glyph (
Interact) for low vision. - Avoid rapid prompt flashing.
Anti-patterns in fest reviews
| Review phrase | Often means |
|---|---|
| Controls confusing | Glyph/table drift |
| Wrong button | Path mismatch |
| Does not support controller | No gamepad rows in JSON |
Friday Block 5 row
unity_glyph_table_pass=Y/N; receipt=release-evidence/unity/input/unity_glyph_table_receipt_v1.json
Working dev path — binding path export script
Editor menu script to dump paths (run once per action map change):
// Editor: Tools/Dump Binding Paths — logs effective paths for selected asset
foreach (var action in asset) {
foreach (var binding in action.bindings)
Debug.Log($"{action.name} -> {binding.effectivePath}");
}
Paste log into spreadsheet; diff against glyph_table_v1.json before promotion.
Pair with Unity 6.6 LTS revalidation when upgrading editor version—re-dump paths after package bump.
Control schemes (Gamepad vs Keyboard vs Steam Deck)
| Scheme | Tonight |
|---|---|
| Keyboard&Mouse | Required rows |
| Gamepad | Required rows |
| Steam Deck (virtual) | Often maps like Gamepad—verify on hardware |
Do not hard-code Gamepad only—read active control from PlayerInput.
Common mistakes (seven)
- Glyph per action name instead of binding path.
- Fest demo shows full-game rebinding menu.
- Legacy Input Manager prompts mixed with Input System.
- No keyboard row for PC players.
- Skipping 1280×800 proof.
- Debug actions still bound.
- Promotion without receipt.
Pro tips (six)
- Freeze glyph_table during fest week—version in filename if you must change.
- Show
build_labelnear pause for support tickets. - Use Input System icons package only if license clear.
- One prompt prefab fed by table—no duplicate Image hacks.
- Run Wednesday smoke after U5.
- Schedule preflight before Verified resubmit—not before first fest demo.
Snippet-friendly answers
How do I show correct Steam Deck buttons in Unity 6?
Build glyph_table_v1.json keyed by Input System binding paths, swap UI sprites when control scheme changes.
Input System 1.14 vs 1.11?
Re-dump binding paths after upgrade; update JSON rows.
Do I need Steam Input tonight?
Not for first fest demo glyph table—needed for deeper Deck Verified preflight.
FEST_DEMO scripting define
#if FEST_DEMO
// Strip Debug action maps from build
#endif
Add define in Player Settings → Scripting Define Symbols for fest branch builds—reduces accidental debug binds in Gate U1.
Validate-packet optional guard
Extend validate-packet to fail if glyph_table_v1.json missing when platform_steam_deck_targeted=true.
Ninety-minute compressed path (solo)
| Min | Task |
|---|---|
| 0–15 | Scope doc |
| 15–35 | Debugger dump + JSON |
| 35–55 | Wire one Interact prompt |
| 55–75 | U3 screenshot |
| 75–90 | Receipt |
Ship one correct prompt before adding Jump—proves pipeline.
Month-one adoption ladder
| Week | Goal |
|---|---|
| 1 | glyph_table + U1–U5 |
| 2 | BUILD_RECEIPT habit |
| 3 | Deck hardware spot-check |
| 4 | Preflight guide if pursuing Verified |
Key takeaways
- One evening builds your first fest-demo glyph table—not full rebinding.
- Key JSON by binding path, not action display name.
- U1 limits actions to demo scope.
- U3 requires 1280×800 screenshot proof.
- Include keyboard glyphs for PC fest players.
unity_glyph_table_receipt_v1.jsongates promotion.- Preflight guide is the next step for Verified.
- Input System 1.14 churn makes path dumps mandatory after upgrades.
- Pair with BUILD_RECEIPT, Wednesday smoke, playtest isolation.
- Five to eight glyphs beat twenty inconsistent prompts.
glyph_unknownfallback prevents blank UI.- Fest hour-one actions only—strip debug binds.
- Log
effectivePathwhen debugging wrong sprites. - Evidence folder:
release-evidence/unity/input/. - Subscribe to
onControlsChangedfor hot-plug controller tests. - Re-dump binding paths after every Input System package upgrade.
Glyph sprite naming convention
Use predictable IDs so art swaps do not break JSON:
| glyph_id | File | Use |
|---|---|---|
xbox_a |
Glyphs/xbox_a.png |
South face |
xbox_b |
Glyphs/xbox_b.png |
East face |
key_e |
Glyphs/key_e.png |
Keyboard |
key_space |
Glyphs/key_space.png |
Keyboard |
glyph_unknown |
Glyphs/unknown.png |
Fallback |
Do not embed platform name in action names—keep platform in glyph_id only.
OnControlsChanged hook (recommended)
Subscribe so prompts update when player plugs controller mid-session:
void OnEnable() {
playerInput.onControlsChanged += RefreshPrompts;
}
void RefreshPrompts(PlayerInput pi) {
UpdateInteractPrompt(pi.actions["Interact"]);
}
Fest reviewers hot-plug hardware—static prompts fail this test.
Store page honesty crosslink
If store text says full controller support, fest demo must pass U3–U4. If keyboard only, remove gamepad glyphs from marketing stills—FAQ lines parity applies to input claims.
Build pipeline note
| Build type | Check |
|---|---|
| Development | Debug actions may exist—do not proof |
| Fest release | FEST_DEMO define on |
| Playtest | May include debug—separate glyph_table version optional |
Align with playtest scope map surfaces.
Evidence for BUILD_RECEIPT row
| Column | Example |
|---|---|
glyph_table_pass |
Y |
glyph_table_sha256 |
sha256:… |
input_system_pkg |
1.14.0 |
deck_proof |
U3_1280x800_interact.png |
Read order for new Unity hires
- This pipeline (first table)
- 16 tools listicle
- Preflight before Verified
- LTS revalidation on editor bump
Versioning glyph_table when actions change
When you add a new fest-hour action mid-cycle:
- Bump
project_versionin JSON. - Re-dump binding paths.
- Re-run U3 screenshots only for changed prompts.
- Append row to
glyph_table_revision_log.mdwith date andbuild_label.
Do not silently edit rows without version note—playtesters correlate photos to builds and receipts.
FAQ
We still use legacy Input Manager?
Migrate demo scene to Input System first—this pipeline does not cover legacy.
UI Toolkit vs UGUI?
Table is agnostic; wiring differs, JSON stays same.
Same button for Jump and Interact?
Allowed—duplicate rows with same glyph_id if paths match.
Does UI InputSystemUIInputModule affect world prompts?
Menu navigation may use separate actions—list UI actions separately in demo_input_scope.md.
Can we use TextMeshPro with sprite glyphs?
Yes—drive sprites from the same table via Image or TMP inline sprites.
Local co-op in full game but not demo?
Single-player fest demos ignore second player; add playerIndex column later if couch co-op ships in demo.
Sample QA script for playtesters
Send with playtest branch password:
- Launch demo; note
build_labelon title. - Connect controller; reach first interactable; photograph prompt.
- Switch to keyboard; repeat interact prompt.
- File form:
build_label, device, photo, pass/fail.
Qualitative signal beats guessing from Discord text.
When to skip glyph table tonight
- Pure mouse/touch UI with no controller prompts
- Fest SKU is keyboard-only and store copy says so
- Zero on-screen binding hints (rhythm game lane icons only)
Otherwise run the pipeline—E on screen with A sprite is fixable in one evening.
Conclusion
Deck reviewers do not read your Input Action asset—they read your prompts.
Inventory demo actions. Build the table. Proof at 1280×800. File the receipt. Then promote the fest branch.
Wrong glyphs are cheaper to fix before October traffic than in refund threads and one-star control complaints.
If you already maintain a spreadsheet for BUILD_RECEIPT, add one row linking build_label to glyph_table_v1.json hash so producers can audit prompts without opening Unity.
Next reads: Input System rebinding preflight, 16 Deck testing tools, Wednesday demo smoke. Ship the table before you ship the fest branch.