Game Data Workbench Core - Spreadsheet-style editor with computed columns, bulk ops, and cross-schema search

If you've ever had to tune 150 enemy stats by opening assets one at a time in the Inspector, this is for you.

Game Data Workbench Core is a professional table-based data editor for Unity that turns your ScriptableObjects into a sortable, filterable, inline-editable spreadsheet - without touching your data pipeline.


What it does

Browse and edit all your records in one place. Select a ScriptableObject type and every asset of that type appears as a row. Edit any field inline. Full Undo support throughout.

Computed columns with a real expression engine. Add formula-based columns like [damage] * [attackSpeed] for DPS, or ([value] - avg([value])) / avg([value]) for deviation from mean. 20+ built-in functions including aggregates (sum, avg, median), math (clamp, lerp, pow), and conditionals (if with short-circuit evaluation). Results update live.

Batch Operations queue. Select any number of rows and build a multi-step operation pipeline: Set Value, Add, Multiply, Linear Sequence, Random Range, or a custom expression. Each step shows a live preview with green/red diff coloring. Save queues as personal or project-scoped presets (project presets are version-controlled and shared with the team).

Excel and Google Sheets interop. Copy rows with Ctrl+C - you get TSV with a header row. Paste directly into Google Sheets or Excel. Edit there. Copy back. Paste into GDW. Column matching is by header name so order doesn’t matter.

Advanced search and filtering. Text search, property filters using a query syntax (damage>50 element=Fire), per-column filter popups, and filter chips. Cross-schema search (Ctrl+Shift+F) searches every registered schema simultaneously - useful when you know the value but not which type it’s in.

Record link navigation. Ctrl+Click any reference field to navigate directly to the referenced record, even if it’s a different schema. A breadcrumb bar tracks your history. Alt+Click opens in a new window for side-by-side comparison.

Summary row. Click Σ in the toolbar to add per-column aggregate formulas (sum, avg, min, max, count, median, or custom expression) evaluated against the currently visible filtered records. Persisted per schema in ProjectSettings.

Cell annotations. Right-click any cell to add a note. Notes show as a blue triangle indicator with author and timestamp on hover. Searchable with note:keyword in the search bar. Stored in ProjectSettings and shared via version control - useful for “don’t touch, tutorial depends on this” or post-playtest feedback.

Row grouping. Group records by any enum, bool, or text field into collapsible sections. Group enemies by faction, items by rarity, spells by element. State persists per schema.

Changed-cell highlights. After a bulk operation, affected cells get a colored left border so you can see at a glance what moved. Configurable: timer-based fade, persist until next action, or manual clear.

Schema Creator. Design new ScriptableObject types visually - add fields, define enums and structs, configure namespaces and CreateAssetMenu paths - and generate the C# file with a click. Live code preview updates as you work.

Import / Export (CSV and JSON). Full round-trip with column mapping, key-field-based record matching (update existing vs. create new), type coercion (including Color hex and asset resolution by GUID/path/name), and a review step before anything is applied.


What’s included

  • Spreadsheet-style table view built on UIToolkit MultiColumnListView
  • Multi-column sort, column show/hide, reorder, resize
  • Inline editing with full Undo for every operation
  • Collections editor (lists and nested data in a dedicated side panel)
  • Find & Replace, Smart Rename (rename asset files from a field value)
  • Bookmarks and pinned records
  • Recent Changes Log (per-session audit trail, exportable as CSV)
  • Command Palette (Ctrl+K)
  • Fully customizable keyboard shortcuts
  • Extensibility API: custom cell drawers, search parsers, IDataSource adapters

Architecture note for programmers

Every feature in the tool - the table view, search and filtering, computed columns, bulk operations, import/export, the Balance charts - talks to a single IDataSource interface. Nothing in the application touches ScriptableObject, SerializedObject, or AssetDatabase directly. The built-in ScriptableObject adapter is the default implementation, but it’s just one implementation of that interface.

If your data lives somewhere other than .asset files, you can implement IDataSource yourself and the entire editing environment works against your backend without modification. The interface is documented and the ScriptableObject adapter serves as a concrete reference implementation.

The upcoming Sync module will ship additional IDataSource implementations out of the box: XML, JSON, CSV, and Google Sheets - so the full table editing environment works directly against those sources, not just as an import/export bridge.


Links

Currently 30% off at launch - $20.99.

Additional modules coming as separate packages: Balance (visual charts: line, histogram, scatter, radar, box plot, heatmap, comparison - with drag editing and snapshots), Sync (live data sources for XML, JSON, CSV, and Google Sheets), and Validation.

Happy to answer questions about the architecture or specific features.

Unity Discussions — 1.1.0 Update

Game Data Workbench Core 1.1.0 is out — this is a substantial update. Highlights below.

Conditional Formatting

The biggest addition. Right-click any column header and choose Color by… to apply one of eight formatting modes:

  • Gradient — smooth color ramp across the column’s value range
  • Thresholds — up to 16 user-defined bands, each with its own color
  • Delta-vs — signed-magnitude gradient centered on zero; negative and positive ranges color independently
  • By-value — assign a specific color to specific values (useful for enums)
  • Contains-text — highlight rows where a text field matches a substring
  • Text-color — recolor the text instead of the background
  • Data bars — Excel-style in-cell bars with zero-anchored support for signed ranges

Six built-in theme-aware palettes plus a user-defined two-stop custom palette. Conditional formatting is applied per column, stacks with filters, and persists with the column layout.

Selection Model Rewrite

Cells, rows, and columns are now three independent selections — closer to how Excel/Sheets handle selection rather than a simple row-click model.

  • Active-cell outline with keyboard navigation (arrows, Tab, Shift+Enter)
  • F2 / Enter / Space to enter edit mode; Esc backs out one stage
  • Ctrl+A selects all rows
  • Excel-style row/column anchors for range selection
  • Header click now selects the column — sort has moved to the kebab menu

Column Header Kebab Menu

A button is now always visible on column headers. It consolidates sort, filter, group, hide, conditional formatting, summary formula, and add-computed-column — all in one place. The kebab tints when the column has an active filter, and includes a Clear filter entry that removes the filter without opening the popup.

Column Layout Scopes

Saved column layouts now have Personal and Project scopes. Project layouts are stored under ProjectSettings/ and committed to version control — the whole team gets the same layout. Promote a personal layout to project scope, or copy a project layout down to personal, with dedicated actions in the layout dropdown.

Other Changes

  • Batch Operations chaining — a Custom Expression step now sees the values produced by earlier steps in the queue. Chain [damage] × 2 then [damage] + 100 and the second step operates on the doubled value.
  • Scientific notation in expressions: 1e3, 2.5E-2, 6.022e23 are now valid literals in computed columns, summary formulas, and batch expressions.
  • Open Table Views toolbar dropdown (Unity 6.3+) — a new entry on Unity’s main toolbar to bring any open Table View window to the front.
  • All UI state (grouping, sort, filters, hidden columns, summary row toggle, splitter sizes) now persists across window close/reopen and editor restart.
  • Delete behavior clarified — deleting a ScriptableObject-backed record is not undoable via Ctrl+Z because the .asset file moves to the OS recycle bin. The UI no longer claims it is. Restore from recycle bin and re-import for accidental deletes.



Full changelog: Release Notes | GDW

Game Data Workbench Core 1.2.0 is out. Focus this update: filtering and search.


Type-Aware Column Filters

The Filter… popup now adapts to the column type instead of offering a generic range input.

  • Color — Equals / Not Equals / Approximately Equals with configurable tolerance
  • Flags enum and LayerMask — bitwise Has Any / Has All / Has None / Equals
  • Vector2/3/4, Quaternion — per-axis ranges or magnitude filter
  • Rect / Bounds — per-component ranges
  • Object reference — Equals / Not Equals with asset picker

Existing filter types also got expanded operators: numeric adds Range / ≥ / > / ≤ / < / = / ≠, text adds Does Not Equal, enum adds Any of / Equals / Not Equals.


Saved Searches

Name and persist search expressions per schema. Personal scope stores per-machine; Project scope commits to ProjectSettings/ for version control — same model as 1.1.0 column layouts.

The caret next to the search field opens a sectioned dropdown of saved searches and recent searches.


Selection-Summary Status Bar

When you have a multi-cell selection, a status bar shows aggregate chips: Rows / Count / Sum / Avg / Min / Max for the selected values. Click any chip to copy the value to the clipboard.

Other Additions

  • Edit a filter from its chip — clicking a chip’s body (not the ✕) reopens its filter popup pre-loaded with the current settings. No need to re-enter values when adjusting a filter.
  • Second toolbar row with column-width cluster (Stretch / Fit Headers / Compact / Auto-fit), Columns visibility popup, and quick-access buttons for Find/Replace, Find Across, and Clear Filters. Delete record moved to row 2 far right, visually separated from Create.
  • Live-update Preferences — changes to Row Height, Highlight Color, Header Format, and Changed-Cell Highlight Mode propagate to open windows immediately.
  • Command Palette MRU — a Recent Commands section at the top of the command palette.
  • Toolbar buttons (Import, Export, Ping, Delete, and others) now use icons instead of text labels.

Full changelog: Release Notes | GDW

Game Data Workbench Core 1.2.1 has been released. This is foremost a bugfix update but also contains a nice new feature :wink:

Added

  • Active saved-search awareness: when you apply a saved search, an amber badge appears at the left of the filter chip bar; a trailing * + italic marks divergence as soon as you edit a chip. Clicking the badge opens the saved-searches dropdown, which gains two conditional rows above “Save current search…”: ↻ Update ‘’ (overwrite the entry with your current state) and ⟲ Reset to ‘’ (discard local edits and re-apply the saved expression). The dropdown also highlights the active row in bold + tint. Switching to a different saved or recent entry while you have unsaved chip edits surfaces a “Discard unsaved changes?” confirm so the edits aren’t lost silently.
  • Recent Searches Cap preference (default 20, range 1–100): Preferences ▸ Game Data Workbench ▸ Table View lets you tune how many recent searches the dropdown remembers per schema

Fixed

  • Column-header sort priority indicator now numbers from ↑1 / ↓1 — hidden-column or orphan sort entries no longer inflate the visible priority number
  • Selection-summary status bar now refreshes on every selection mutation (Ctrl+click extend / Shift+click extend / Ctrl+click deselect) instead of staying frozen at the first selection’s aggregates
  • “Save current search…” footer in the saved-searches dropdown reliably reflects the live filter state after editing a chip — opening the dropdown no longer reuses a stale cached instance
  • Saved-searches dropdown now scrolls when many entries accumulate, so Recent rows no longer stack on top of each other when there are more entries than fit; the “Save current search…” footer stays pinned at the bottom

Full changelog: Release Notes | GDW