VR tablet interface built with Unity UI Toolkit and Meta Interaction SDK in under 8 weeks. Demonstrates how a UGUI-based system can be transitioned to a modular, separated architecture with centralised styling driving both 2D panels and 3D elements.
Research Documentation · System Documentation · Studio Presentation
Developed as part of my internship as an Immersive Developer for Mersus Technologies
The goal was recreating the existing interface without needlessly rewriting backend systems, while keeping Meta Interaction SDK elements intact on top of UITK documents. Localisation was a central requirement, integrated from the start.
- Panel-based architecture -- each screen is a self-contained host with its own UXML document and USS styles
- Elements Records pattern -- type-safe C# records decouple UXML element queries from backend logic
- Meta SDK hand tracking -- 3D buttons driven by
PokeInteractorandInteractableUnityEventWrapper - ScriptableObject theming --
TabletStyleSOdrives colours, fonts, tweens, and materials for all 3D elements - Unity Localization -- labels and TMP strings bound through a central string table
- PrimeTween animations -- allocation-free tweens with SO-driven parameters
- CSS custom properties --
core.uss:rootvariables provide a single place to tweak colours, radii, and motion across all 2D panels
flowchart TB
Host[HostBase<br/>manages UIDocument + root]
Elements[Elements Records<br/>typed UXML references]
Query[DocumentQueryUtil<br/>Q<T> extension methods]
Loc[Unity Localization<br/>string table binding]
Tween[PrimeTween<br/>animations]
XR[Meta Interaction SDK<br/>hand-tracked 3D buttons]
Host -->|queries| Query
Query -->|populates| Elements
Elements -->|references| UXML[UXML Documents]
Loc -->|binds labels| Host
Tween -->|animates| Host
XR -->|PokeInteractable| Host
flowchart TB
SO[TabletStyleSO<br/>colours, fonts, tweens, materials]
USS[USS Stylesheets<br/>2D UI theming]
StyleCtrl[Style Controllers<br/>3D MaterialPropertyBlock]
SO -->|drives 2D| USS
SO -->|drives 3D| StyleCtrl
USS -->|applies to| UXML[UXML Documents]
StyleCtrl -->|applies to| Buttons[3D Button Meshes]
The 2D and 3D sides of the tablet UI are styled from the same design intent. core.uss handles everything flat; TabletStyleSO handles everything spatial. Both are swappable without touching code.
core.uss defines a :root block of CSS custom properties -- backgrounds, borders, text, accents, radii, motion -- that every panel stylesheet inherits. Change a variable in one place, every panel updates. Each panel layers its own USS on top for layout-specific rules.
TabletStyleSO holds the same design tokens for 3D elements -- layer colours, content colours, font mapping, and tween parameters. Style controllers read from this SO and push colours to renderers via MaterialPropertyBlock, avoiding material duplication entirely. Swapping the SO asset re-themes every 3D button with a single assignment.
All user-facing text flows through Unity's Localization package. String tables are maintained as CSV, making it straightforward to add languages and share translations.
Project Structure
Assets/
UI Toolkit/
Documents/ -- UXML panel layouts
Styles/ -- USS stylesheets (core + panel-specific)
Scripts/
Data/ -- ScriptableObjects (TabletStyleSO, ModuleData, UserData, ThemeSO)
Interactions/ -- MetaHandJointPokeDriver (XR hand tracking bridge)
UI/
Constants/ -- UIElements, UIStyleSheets, UIStyleClasses, TabletShaderIDs, LocalizationKeys
Controllers/
Styles/ -- ButtonStyleController, FlatButtonStyleController, TextFieldStyleController, CanvasStyleController
Tablet/ -- LobbyTabletController
Elements/ -- Sealed records per panel
Enums/ -- TabletFontStyle, TabletPanels, TweenType
Hosts/ -- Panel hosts (Start, MyTraining, Language, GeneralSettings, Module)
Interactables/
Buttons/ -- DropDownToggle
Interfaces/ -- ITweenable
Tweenables/ -- ButtonGrowTween, PositionTween, ScaleTween
Utilities/ -- DocumentQueryUtil, VisualElementUtil
Factories/ -- UIElementFactory
Scriptable Objects/
Styles/ -- MainTheme ScriptableObject
Users/ -- User data assets
Localization/ -- Unity Localization string tables
- Unity 6000.2.9f1
- UI Toolkit (runtime UI Documents in world space)
- Meta Interaction SDK (PokeInteractor, InteractableUnityEventWrapper)
- Unity Localization (string table + UITK binding)
- PrimeTween (allocation-free animation)
UI_2D.mov
UI_3D.mp4
Note: The front-end layers (Display, Elements, Styling, Localisation) are complete and functional. The Data layer SOs and controller bindings are scaffolded for demonstration.
A full migration would flesh these out with real data pipelines and production-ready event routing.

