Themes is a ThemeDatabase-driven UI value and binding system for theming, white-label branding, and style profile switching.
It centralizes visual and behavioral UI values (colors, sprites, strings, floats, bools, textures), then applies them consistently across complex hierarchies in edit mode and runtime.
- Where do I get it?
- Requirements & Dependencies
- Highlights
- Core Concepts
- Typical Workflow
- Documentation
Please find the latest version of Themes on the Unity Asset Store.
- Unity
6000.3or newer com.unity.uguicom.unity.nuget.newtonsoft-jsoncom.unity.textmeshpro- [optional]
com.unity.localization(adds a LocalizedString -> TMP_Text binding)
The included Sample has additional dependencies which are intentionally not installed via asset manifest.
- Centralized
ThemeDatabasesystem - Theme any serializale value via
ThemeValue<T>- extensible via converters, modifiers, and previews. Bindablewrappers for standard selectables (Button,Toggle,Slider,Scrollbar,Dropdown,InputField,TMP_Dropdown,TMP_InputField).- Built-in bindings for common UI targets (
Graphic,Image,TMP_Text,Transform,GameObject), with extension points for arbitrary custom targets. - Full selectable-state hook for fan-out binding: one selectable can drive any number of bindings and update multiple graphics/components per state.
- Inspector dropdown previews for theme values, including color dots, sprite/texture thumbnails, and value previews/tooltips for generic entries.
- Editor JSON import/export for full database snapshots and Runtime side loading of individual themes.
The package works with exactly one active ThemeDatabase per project session.
When no database exists, the editor creates a default one at:
Assets/Resources/ThemeDatabase.asset
Resources is only the default creation location, not a requirement. The active database is resolved through PlayerSettings preloaded assets, not Resources.Load, so it does not need to stay in a Resources folder (where it would otherwise be force-included in every build).
Each definition has a stable GUID and a value type. Runtime ThemeValue<T> references store this GUID and resolve the value through the active database.
- Constant values are shared across all themes.
- Theme-specific values are stored separately in each theme.
Definitions can be converted both ways directly in the inspector.
- Bindable components expose selectable state changes as observable state.
- Binding components read
ThemeValue<T>and apply values to target components for static, selectable, or toggle-aware workflows. - Built-in bindings focus on uGUI/TMP targets, but custom bindings can target arbitrary component types (for example
Lightin the sample).
- Create or select the active
ThemeDatabase. - Define themed entries and decide constant vs per-theme storage.
- Configure your theme set (for example Light and Dark).
- Replace selectables with bindable variants via the selection menu or a component's
Replace By Bindable{Type}context menu (references are preserved). - Add bindings and assign
ThemeValue<T>references. - Switch themes through
ThemeDropdown/ThemeSetter/ThemeSelector, or direct API calls.
- Getting Started: first setup pass and quick tutorial.
- ThemeDatabase: in-depth data model, inspector workflow, JSON format, rename safety, and serialization limitations.
- Bind Components: the binding components and their inspector - value selection, modifiers, quick-add, targets, and transitions.
- Project Settings: project-wide activation and settings behavior.
- Sample: walkthrough of the included example content.
- Scripting API: public API usage with focus on custom value types, converters, modifiers, previews, custom bindings, and rename safety.
- Localization: optional localization integration.
