CrimsonInspectorv1.0In development
Follow development on Discord

Open-ended object introspection: any object exposes structured data as a bag of FInstancedStruct payloads, and tooltips, AI or search panels read only the types they understand.

Coming Soon · Gameplay · Unreal Engine 5

Kill the fat tooltip struct. Let any object describe itself.

Any UObject can describe itself to a tooltip, AI context builder, search index or comparison panel, and neither side includes the other's headers. Providers fill a bag of FInstancedStruct payloads; consumers read only the types they understand. New data never means editing a shared struct.

Why CrimsonInspector

Providers say what they know; consumers take what they can use. Neither side knows the other exists.

One interface, any provider

Implement ICrimsonInspectable on an actor, component, item or any other UObject and fill Provide Inspector Data. It is a BlueprintNativeEvent, so a Blueprint class and a C++ override both work. The provider never knows who is reading.

Consumers read what they understand

A tooltip pulls names and stats, a crafting panel pulls crafting data, an AI builder pulls whatever it needs. Each calls Get Inspector Data and picks out its own types. Unknown entries are skipped: nothing breaks, nothing couples.

A vocabulary for the basics

Five ready structs every consumer can render: display name with subtitle, soft-referenced icon, stat line (label, value, unit, gameplay tag), text line for lore or descriptions, and a section header for grouping. Typed adders and getters ship for each.

Your own payload types

Emit any struct: a Blueprint Structure through Make Instanced Struct, or any USTRUCT with AddEntry<T> in C++. Consumers that know it read it with Filter By Type. Your existing tooltip, which never heard of it, stays unchanged.

Ask only for what you need

Consumers pass request tags (Identity, Stats, Description, Tags) and providers guard each group with IsCategoryRequested. A query that wants only stats skips the cost of building names, icons and lore. An empty request returns everything.

Merge objects into one bag

The output array is appended to, never cleared, so one consumer can merge an item and its enchantments into a single payload. Section headers group what follows into Combat or Lore; flat-list consumers simply skip them.

A closer look

A hover tooltip without a shared struct

The weapon emits a name, damage and attack speed. The tooltip calls Get Inspector Data, then Try Get Display Name and Get Stat Lines, and spawns one row per stat. Neither class includes the other.

  • Stat lines carry a label, value, unit and optional gameplay tag
  • The same provider and consumer helpers work from Blueprint and C++

New data without touching old consumers

Crafting requirements, quest hints, anything no built-in struct covers: define a struct, add it to the bag, and read it in the one panel that cares. Every other consumer keeps working exactly as before.

  • Define it as a Blueprint Structure or a C++ USTRUCT
  • Read it back with Filter By Type, or GetPtr<T> in C++

One provider feeds tooltips, AI and search

The providers behind your tooltips also answer an AI context builder, a search index, an item comparison panel or a debug log. Each consumer requests the categories it needs and reads the types it knows.

  • Built-in request tags: All, Identity, Stats, Description and Tags
  • Compare two items by collecting the same stat types from both
  • A local, read-only query: each machine describes the object as it currently sees it

Technical details

Engine
UE 5.8
Tested platforms
Windows
Blueprint-ready
Yes
C++ required
No
Network replicated
No
Dependencies
Core, CoreUObject, Engine, GameplayTags

Frequently asked questions

Do I need C++ to use it?
No. A Blueprint adds Crimson Inspectable under Class Settings, fills Provide Inspector Data with the typed adders, and reads payloads with Get Inspector Data, Try Get Display Name, Get Stat Lines and Filter By Type. Two conveniences are C++ only: the AddEntry<T> template (Blueprint uses Make Instanced Struct) and ICrimsonInspectable::CollectInspectorData (Blueprint uses Get Inspector Data).
Does it draw the tooltip for me?
No. It ships no widgets: it is the data contract between whatever describes an object and whatever displays it. You build the tooltip, panel or AI query; the helpers hand it typed names, icons, stats and text.
Does it work in multiplayer?
Inspection is a local, read-only query and replicates nothing, which is why the specs say "replicated: no". Each machine describes the object as it currently sees it, so a client reads whatever values your own networking has replicated to it.
Does it depend on other Crimson plugins?
No. It is fully standalone and needs only the engine's Core, CoreUObject, Engine and GameplayTags modules. CrimsonCore ships no dedicated Inspector wiring and none is needed: any system from any plugin becomes a provider by implementing ICrimsonInspectable.
Can I buy it yet?
Not yet. CrimsonInspector is still in development and not on sale. It needs no other Crimson plugin, so when it ships it drops into any project on its own, or next to the rest of the suite without dependency conflicts.

Describe it once. Read it everywhere.

Enable the plugin, add Crimson Inspectable to one actor, and print its name and stats from any Blueprint in a handful of nodes. The Quick Start walks the provider and consumer side by side.