Home · Case studies · Systems

Intelligent AR: Reusable Widget System for FC 24

A family of three contextual gameplay overlays, Possession, Last 5 Shots, and Stamina, all composed from one shared component library. The modularity cut delivery time in half on FC 24, and made the FC 25 refresh a 4.5-hour job.

Role

Technical UI Designer

Team

10+ across engineering, design, production, QV

Technical Stack

Frostbite · UI shaders · SVG · dynamic layouts

Shipped

EA Sports FC 24 · September 2023

4 d → 2 d

FC 24 Possession panel, actual vs. 4-day estimate

2 d → 4.5 h

FC 25 refresh, one edit propagated to every panel

5

Reusable components in the shared library

3

Distinct AR panels shipped from the same primitives

At a glance

  • One shared library of 5 primitives powers three distinct panels: Possession, Last 5 Shots, and Stamina.
  • Every panel is a composition of the same primitives, not a copy of the previous one.
  • The pattern carried into FC 25 with near-zero rebuild cost, and became inheritable by a different rotation of hands.
Detail below

The problem

New feature, uncharted pattern, three panels on-screen at once.

Intelligent AR was a new gameplay-adjacent HUD family for FC 24, overlays that surface match-relevant statistics during natural lulls in play, without stealing focus. Three panels had to read as one visual language and be maintainable by a small team on a hard schedule, but each carried different data, different affordances, and different pacing.

Contextual but not distracting was easy to describe in review. Hard to specify up front.

Constraints

Team scale

10+ people across engineering, design, production, and QV. Coordination cost was real.

Design volatility

Visual direction was going to shift late; the system had to absorb changes without a rebuild.

Cross-year handoff

Whatever shipped in FC 24 would be inherited by a different rotation of hands on FC 25.

Reusable ≠ generic

Shared components had to serve three distinct panel intents without homogenizing them.

The key idea

Do the breakdown once, at the family level. Every panel becomes a composition, not a copy.

I decomposed the AR family into five primitives before any panel was built, ARPanel, ARPanel_Header, ARPanel_Background, ARPanel_Corners, TeamCrest. Each has a defined input schema and its own enter/exit animation. Possession, Last 5 Shots, and Stamina were then a matter of assembling the same pieces differently.

Step 1 Panel identified

Last 5 Shots panel highlighted inside the shared FC AR design language, broken down as a composition of Team Crest and ARPanel.
Each ground-panel picks its slot in the shared visual language, then declares its composition.

Step 2 Composition, one level down

Last 5 Shots panel decomposed into AR Panel plus Team Crest, with their inputs and animation specs.
The panel resolves into AR Panel + Team Crest, each with a defined input schema and enter/exit animation.

Step 3 Primitives all the way down

AR Panel further decomposed into ARPanel_Background and ARPanel_Corners primitives with their sizing, color and animation rules.
AR Panel is itself a composition of primitives. This is where the reuse pays off: the whole family shares the same background, corners, and animation grammar.

Production highlights

Performance

Text glow, shader → sprite

The original custom shader had poor performance. Swapped for a fading glow sprite that read equally well at gameplay distance. Frame budget freed for panels the player actually notices.

Visual

SVG look without shipping SVG at runtime

Chevrons authored as SVG at design time; field lines animated with UV tricks (uv.x repeat, uv.y clamp) so a single texture produced the flowing-line effect without new shader work.

Motion

Layouts that reflow mid-animation

Every panel resizes gracefully when data changes size. Ring color uses a 3-way lerp, base → warning → critical, so stamina reads expressive rather than binary.

Signal

Predicted trajectory over motion vectors

Raw motion vectors were noisy. Drawing from the ball's predicted trajectory smoothed the visualization naturally over the frames a panel is on screen.

Before and after of the FC 25 xG (expected goal) widget: original compact version on the left, refreshed larger version on the right.
The FC 25 refresh, one composition edit, propagated everywhere. What was a two-day change on FC 24 shipped in 4.5 hours.

What I'd carry forward