Guide
Game radial menu systems explained
Harbor Siege shipped emotes behind a nested text chat command. In co-op breach runs,
players typed /wave while taking fire — social callouts dropped 40% week
over week. Moving gestures to a hold-to-open radial wheel with eight
sectors cut average emote latency from 4.2 s to 0.6 s and raised ping-plus-emote combos
in telemetry. That is a radial menu system: a circular UI that maps
discrete actions to angular sectors, selected by stick deflection, mouse angle, or touch
drag from a center anchor. Radials trade screen space for muscle memory — one button
opens many choices without hunting a linear bar. They pair naturally with
emote wheels,
weapon swap rings, ability palettes, and
ping wheels,
but compete with
linear hotbars
when players need at-a-glance cooldown state. This guide covers wheel taxonomy, the
selection pipeline, sector layout and dead zones, combat-time policy, input surfaces,
the Harbor Siege refactor, a technique decision table, pitfalls, and a production
checklist.
What radial menus change (and what they do not)
A radial reorganizes how the player picks an action, not what the action does. The underlying ability, emote, or weapon swap logic stays identical to a hotbar binding.
| Layer | Radial changes | Does not change |
|---|---|---|
| Input mapping | Angle + release selects slot instead of direct key press | Ability cooldowns, ammo counts, or unlock gates |
| Screen layout | Temporary overlay centered on cursor or character | Persistent HUD footprint of a fixed action bar |
| Motor learning | Directional muscle memory (“up-left = heal”) | Whether the heal is channeled or instant |
| Combat pacing | Often pauses or slows time while open | Enemy AI tick rate outside the menu window |
Wheel taxonomy
Not every circle menu is the same interaction. Pick a taxonomy entry per wheel type in your game and document it in your input spec so QA can regression-test each mode.
| Mode | Open gesture | Select gesture | Best when | Weakness |
|---|---|---|---|---|
| Hold-to-aim-release | Hold modifier or shoulder button | Deflect stick; release to confirm highlighted sector | Combat wheels; prevents mis-fires on tap | Slow for actions needed every 2–3 s |
| Tap-toggle | Single tap opens wheel until second tap | Click sector or press bound number | Mouse-heavy strategy, inventory wheels | Leaves UI open during panic moments |
| Flick-select | Quick stick flick in direction | No visible wheel; haptic/audio confirm only | Expert players; minimal HUD clutter | Opaque to new players without tutorial |
| Nested ring | Outer ring categories; inner ring items | Hover outer, then inner; or two-step stick | 12+ items (crafting, build menus) | Two-step latency; thumb fatigue on gamepad |
| Contextual slice | Only sectors valid for current target appear | Same as hold-to-aim | Interact wheels on NPCs and objects | Layout shifts confuse muscle memory |
Harbor Siege uses hold-to-aim-release for combat wheels (weapons, gadgets) with 0.35× time dilation, and flick-select for emotes once players complete a 30-second onboarding vignette. Casual players can revert to hold-to-aim in settings.
Selection pipeline
Treat radial open, highlight, and confirm as a small state machine. Partial states (wheel visible but input still moving the character) are the top source of accidental deaths and desynced emotes in multiplayer.
Typical state flow
- Idle — wheel hidden; gameplay input routes to locomotion and camera.
- Open requested — validate gate (not stunned, not in cutscene, wheel unlocked).
- Opening — play scale-in animation (80–120 ms); optionally apply time scale or input lock.
- Highlighting — read pointer angle each frame; map to sector index with hysteresis.
- Confirm — on release or accept button, fire bound action and close wheel.
- Cancel — release inside dead zone, press back, or take hit — close without action.
Angle-to-sector math
Convert stick or cursor offset (dx, dy) to angle with atan2(dy, dx),
normalize to [0, 2π), then divide by 2π / N for N
sectors. Apply a center dead zone (radius 15–25% of wheel radius) so
slight thumb drift does not jump sectors. Add angular hysteresis of 5–8°
at sector boundaries so highlight does not flicker when the vector sits on an edge.
For gamepad sticks, apply a radial dead zone before atan2 — vectors below 0.25 magnitude should map to “no selection” rather than snapping to sector 0. Mouse users benefit from the wheel following the cursor even when it leaves the original anchor; touch users need the anchor locked to the initial press point to avoid drift under the thumb.
Sector layout and visual hierarchy
Sector count and ordering are design decisions, not pure math. Players remember positions, not labels, within a few sessions.
Layout rules that survive playtests
- Cap at eight sectors on the primary ring unless using nested rings; beyond eight, error rate climbs sharply on gamepad.
- Put high-frequency actions at cardinal directions (up/down/left/right) — thumbs naturally rest along those axes.
- Group by category with consistent clock positions — e.g. healing always upper-right across every wheel in the game.
- Gray out unavailable sectors instead of hiding them; hiding shifts indices and breaks muscle memory.
- Overlay cooldown sweeps and ammo counts on icons; radials hide state when closed, so sector art must carry status.
- Label sparingly — icon + 1–2 word tooltip on highlight beats permanent text on every slice.
Align radial visual language with your broader HUD design: same corner radius, glass opacity, and accent color on the highlighted wedge so wheels feel native rather than a modal from another UI kit.
Combat-time policy: pause, slow, or real-time
The biggest feel difference between wheels is whether the world waits. Document a per-wheel policy in your game design doc — mixing policies without UI explanation frustrates players.
| Policy | World behavior | Typical wheels | Risk |
|---|---|---|---|
| Full pause | timeScale = 0; AI and projectiles freeze |
Single-player tactics, build menus | Breaks immersion in action games; unusable in synchronous PvP |
| Slow motion | timeScale = 0.2–0.5 for 2–4 s cap |
Weapon swap, consumable wheels in SP/co-op | Players exploit slow-mo to aim; cap duration and cooldown open |
| Real-time | No time change; player vulnerable | Emotes in safe hubs, quick ping wheels | High skill ceiling; new players avoid the feature |
| Local pause | Only opening player slowed; others normal | Asymmetric co-op with vote-to-continue | Network complexity; feels unfair in PvP |
Harbor Siege caps weapon-wheel slow-mo at 2.5 s per open with a 6 s recharge on the slow-mo privilege. Emote wheels in the social hub run real-time; emotes in combat zones use slow-mo only when no enemies are within 12 m, detected via a cheap overlap query before the wheel scales in.
Harbor Siege refactor: three wheels, one input stack
Before refactor, Harbor Siege scattered actions across number keys, a weapon scroll,
and chat commands. Console certification failed usability review: players could not
emote or ping without a keyboard. The unified RadialDirector shares one
pipeline for three wheels:
- Weapon wheel (hold LB) — six sectors: primary, sidearm, gadget, melee, special, empty. Slow-mo enabled.
- Emote wheel (hold D-pad down) — eight sectors: callouts, dances, squad cheers. Real-time in hub; conditional slow-mo in combat.
- Ping wheel (hold D-pad up) — six sectors: enemy, location, loot, defend, group up, cancel. Real-time always; replicates sector index and world target to squad.
Shared code handles open animation, sector highlight, confirm/cancel, and replication.
Per-wheel ScriptableObject configs define sector bindings, icons, time policy, and
unlock flags. After shipping, mis-weapon swaps in firefights fell 28%, emote usage in
co-op rose 3.1×, and certification usability passed on first submission. The main
regression caught in QA: opening the weapon wheel while climbing ladders — fixed
with a LocomotionTag.BlockRadial gate on mantle and zipline states.
Technique decision table
| Problem | Prefer radial | Prefer linear hotbar | Avoid |
|---|---|---|---|
| 8+ weapons with no fixed order preference | Weapon wheel with slow-mo | Scroll cycle on one button | Number keys 1–9 on gamepad-only SKU |
| Abilities used every 3–5 s with cooldown tracking | Nested radial only if ≤6 actives | Persistent hotbar with sweep overlays | Hold-to-open wheel for primary fire skills |
| Social callouts in co-op | Ping + emote wheels, real-time or light slow-mo | Text chat with quick phrases | Chat-only in voiceless console co-op |
| Context actions on one interactable | Contextual slice wheel (3–5 options) | Cycling interact prompt (tap to cycle) | Full eight-sector wheel with one active slice |
| Competitive PvP loadout swap | Flick-select with no slow-mo | Direct slot keys on PC | Pause or slow-mo weapon wheel in ranked |
| Accessibility: limited thumb range | Large sectors + sticky highlight assist | Remappable linear bar with focus wrap | Flick-only with no hold-to-aim fallback |
Common pitfalls
- Symmetric icons — similar glyphs at adjacent angles cause mis-selects; vary silhouette and color.
- No cancel path — players must pick something to close the wheel; always allow dead-zone release or B/back.
- Wheel follows moving camera — anchor to screen center or character, not world space, unless deliberate.
- Rebinding breaks compass layout — if players remap sectors, show a one-time layout preview.
- Slow-mo stack overflow — opening a wheel inside another menu with separate time scales compounds; use a single TimeDilation stack.
- Network confirm without prediction — emotes appear late; predict locally and reconcile animation ID.
- Tiny touch targets — mobile sectors below 48 dp fail HIG; enlarge outer radius instead of adding sectors.
- Teaching only in text manual — first open needs animated wedge highlight and forced slow-mo tutorial.
Production checklist
- Document wheel taxonomy per feature (weapon, emote, ping, interact).
- Implement shared RadialController with open/highlight/confirm/cancel states.
- Define dead zone radius, angular hysteresis, and max sector count per ring.
- Specify combat-time policy per wheel and enforce max slow-mo duration.
- Gate wheel open on locomotion, stun, and cutscene tags.
- Gray out locked sectors; never remove slots from the layout mid-session.
- Author icon + cooldown overlay prefab reused across all wheels.
- Provide hold-to-aim and flick-select accessibility toggle.
- Replicate sector index and target entity for multiplayer wheels.
- Log mis-select rate, time-to-confirm, and cancel rate per wheel type.
- Certification pass on gamepad-only path with no keyboard fallback.
Key takeaways
- Radial menus trade persistent HUD space for a hold-to-aim selection gesture.
- Sector position is the mnemonic — keep layouts stable and cap primary rings at eight slices.
- Dead zones and angular hysteresis matter as much as icon art for mis-select rate.
- Harbor Siege unified three wheels under one director and passed console usability after emote latency dropped 85%.
- High-frequency combat skills belong on hotbars; radials win for occasional swaps and social callouts.
Related reading
- Hotbar and quickslot systems explained — linear action bars and cooldown overlays
- Emote and gesture systems explained — animation layering and multiplayer sync
- Contextual interaction prompt systems explained — focus detection and priority stacks
- UI and HUD design explained — glass surfaces, readability, and layout grids