1. The Big Picture
Everything in Resonite is a synchronized data model. There is no "game logic" separate from data — the world is the data, and changes propagate automatically across all users.
| Concept | Analogy | What it holds |
|---|---|---|
World | Scene file | One root slot tree + users + settings |
Slot | GameObject / Transform | Position, rotation, scale, active flag, child slots, components |
Component | MonoBehaviour | Typed members (fields) specific to its purpose |
Member / Field | Serialized field | A single typed value: float, string, reference, etc. |
2. Workers & Sync Elements
Under the hood, Resonite's data model is built on Workers — objects that participate in the synchronization system.
Worker
Base class for anything that lives in the data model. Has a unique persistent ID. Slots, Components, and Users are all Workers.
Sync Element
The atomic unit of synchronization. Every field on a component (like Position on a Slot, or Size on a BoxMesh) is a Sync Element. When it changes, the change is replicated to all users.
UserRoot component. That hierarchy contains the user's avatar, head, hands, controllers, locomotion modules, audio streams, and a User dynamic variable space. User components work like any other — they have Sync Elements, can be driven, and are inspectable. Per-user state (like IK, dynamic bones, or user-specific UI) is typically achieved through driven fields, which are computed locally on each client rather than synced over the network.
Change Propagation
When you modify a Sync Element:
- The local value updates immediately
- A change event fires locally (drivers, ProtoFlux nodes react)
- The change is queued for network replication
- Remote clients receive and apply the change
- Remote change events fire on those clients
3. Value Types vs Reference Types
This is the most important distinction in Resonite's type system. It determines which components and ProtoFlux nodes you use.
string and Uri are value types in FrooxEngine's data model — they use ValueField<T>, DynamicValueVariable<T>, etc. However, in ProtoFlux they are object types — use ObjectWrite<string> and ObjectValueSource<string>, not ValueWrite<string>. See wiki: Value Types.
| Value Types (structs) | Reference Types (classes) |
|---|---|
bool, int, long, float, doublefloat2, float3, float4, floatQcolorX, enums, string, Uri
|
Slot, User, GrabberIButton, IGrabbableIAssetProvider<T> (materials, textures, etc.)
|
| Stored inline in memory | Stored as a pointer/reference |
ValueField<T> |
ReferenceField<T> |
ValueWrite<T> |
ObjectWrite<T> |
ValueSource<T> |
ObjectValueSource<T> |
DynamicValueVariable<T> |
DynamicReferenceVariable<T> |
4. Data Container Components
Resonite has many components that "store data," each serving a different purpose and scope.
Pure Storage
The simplest containers. A single typed value or reference, no naming, no hierarchy.
Stores a single value type. The most basic container. Used by drivers, ProtoFlux, and internal component wiring.
[FrooxEngine]FrooxEngine.ValueField<bool>
Stores a reference to another object (slot, component, asset). The reference-type equivalent of ValueField.
[FrooxEngine]FrooxEngine.ReferenceField<Slot>
ValueField and ReferenceField have a built-in proxy mechanism — dropping a slot with one of these components onto an inspector input field will source its value into that field. If you need truly inert storage with no inspector side-effects, use ValueTag<T> / ReferenceTag<T> instead.
Named Variables (Dynamic Variables)
Named, scoped data accessible anywhere within a DynamicVariableSpace. Resonite's primary inter-component communication system.
Defines a namespace scope. All DVVs under this slot (in the hierarchy) with matching space name share a namespace.
[FrooxEngine]FrooxEngine.DynamicVariableSpace
A named value variable within a space. Has VariableName (string) and Value fields. The workhorse of Resonite data binding.
[FrooxEngine]FrooxEngine.DynamicValueVariable<string>
Same as DVV but for reference types. Stores a reference to a slot, component, or asset by name.
[FrooxEngine]FrooxEngine.DynamicReferenceVariable<Slot>
Drivers
Components that continuously drive (overwrite) a target field's value. The target shows a purple indicator when driven.
Drives a single target field from a source value. One-to-one.
[FrooxEngine]FrooxEngine.ValueDriver<float>
Drives multiple target fields from one source. One-to-many.
[FrooxEngine]FrooxEngine.ValueMultiDriver<float>
Copies a source field's value to a target field each frame. Like a driver but from an existing field rather than a constant.
[FrooxEngine]FrooxEngine.ValueCopy<float3>
ProtoFlux Bridge Components
These live on ProtoFlux node slots and bridge between the component data model and ProtoFlux's execution graph.
A reference from ProtoFlux to a component field. Points to a specific IValue/IField (see Interface Types). Must be manually created when using the API.
[FrooxEngine]FrooxEngine.ProtoFlux.GlobalReference<...>
A constant value exposed to ProtoFlux. Unlike GlobalReference, it stores the value directly rather than pointing to another field.
[FrooxEngine]FrooxEngine.ProtoFlux.GlobalValue<string>
ProtoFlux node that reads a value/reference from the data model. Outputs to other PF nodes.
[ProtoFluxBindings]...CoreNodes.ValueSource<float3>
ProtoFlux node that writes a value back into the data model. Triggered by an impulse.
[ProtoFluxBindings]...Nodes.ValueWrite<...>
ProtoFlux-local storage. Persists a value within the PF graph without writing to the data model. Useful for state machines.
[ProtoFluxBindings]...Nodes.StoredValue<float2>
Cloud Variables
Persistent variables stored on Resonite's cloud servers. Survive world restarts and can be shared across worlds.
Reads/writes a cloud variable defined in user or group settings. Value persists across sessions.
[FrooxEngine]FrooxEngine.CloudValueVariable<string>
Like CloudValueVariable but automatically scoped to the active user (the user interacting with it).
[FrooxEngine]FrooxEngine.ActiveUserCloudValueVariable<bool>
ValueDriver.ValueSource is a member field on the ValueDriver component — you point it at a field ID (e.g. DVV.Value). ValueSource<T> is a separate ProtoFlux node that reads values into a graph via a GlobalReference bridge. Same name, completely different things.
5. Interface Types
Interfaces are abstract contracts describing capabilities of fields and components. They're the type constraints that determine what you can wire to what. You never create an IValue<T> directly — you create a DynamicValueVariable<T> whose .Value field happens to implement IValue<T>.
Interface Hierarchy
Most general — any typed field"] IV["IValue<T>
Readable typed value (subset of IField)"] IGVP["IGlobalValueProxy<T>
ProtoFlux bridge proxy"] DVV_V["DVV<T>.Value"] VF_V["ValueField<T>.Value"] GR["GlobalReference<T>"] IF -->|"subset"| IV IV -->|"wrapped by"| IGVP DVV_V -.->|"implements"| IV VF_V -.->|"implements"| IV GR -.->|"implements"| IGVP style IF fill:#2a2a1a,stroke:#FFEB3B,color:#fff style IV fill:#1a472a,stroke:#4CAF50,color:#fff style IGVP fill:#472a1a,stroke:#FF9800,color:#fff style DVV_V fill:#1a472a,stroke:#4CAF50,color:#fff style VF_V fill:#1a472a,stroke:#4CAF50,color:#fff style GR fill:#471a2a,stroke:#E91E63,color:#fff
Core Field Interfaces
| Interface | What It Means | Implemented By | Expected By |
|---|---|---|---|
IField<T> |
Any typed field on any component. Most general. | Every member field | ValueDriver.DriveTarget, ValueCopy.Source/Target |
IValue<T> |
A readable typed value. Subset of IField. | DVV.Value, ValueField.Value, most typed members | ValueDriver.ValueSource, GlobalReference.Reference |
IGlobalValueProxy<T> |
ProtoFlux bridge proxy — wraps IValue for PF nodes. | GlobalReference<T> | ValueSource.Source, ObjectValueSource.Source, event node inputs |
IValue<T>", drop any .Value field from a DVV or ValueField of matching type T. When it says "expects IField<T>", any typed field from any component works.
Reference-Type Interfaces
These interfaces constrain reference-type fields — you'll see them on ProtoFlux event nodes and interaction components.
| Interface | What It Constrains | Common Concrete Type |
|---|---|---|
IButton | Clickable button | TouchButton, UIX Button |
IGrabbable | Grabbable object | Grabbable component |
IAssetProvider<T> | Asset provider of type T | PBS_Metallic (Material), StaticTexture2D (Texture), StaticAudioClip (AudioClip) |
What Goes in GlobalReference<T>?
The generic parameter of GlobalReference determines what it can point at and which ProtoFlux nodes use it.
| GlobalReference<...> | Points At | Used By PF Node |
|---|---|---|
GlobalReference<IValue<float>> | DVV<float>.Value, ValueField<float>.Value | ValueSource<float>.Source |
GlobalReference<IValue<string>> | DVV<string>.Value | ObjectValueSource<string>.Source |
GlobalReference<IButton> | TouchButton, Button component | ButtonEvents.Button |
GlobalReference<IGrabbable> | Grabbable component | OnGrabbableGrabbed.Grabbable |
GlobalReference<IAssetProvider<AudioClip>> | StaticAudioClip component | PlayOneShot.Clip |
GlobalReference<Slot> | Any Slot reference | ElementSource<Slot>.Source |
GlobalReference<[FrooxEngine]FrooxEngine.IValue<float>>, not shorthand. See §13 API Reference.
6. Proxies
"Proxy" is an overloaded term in Resonite. Several component families use the name, each serving a different role. They all share the idea of indirection — standing in for something else — but they operate in different contexts.
Proxy Families
| Family | Components | Purpose |
|---|---|---|
| ProtoFlux Data Proxies | GlobalReference<T>, GlobalValue<T> |
Bridge between ProtoFlux nodes and the component data model. The most important proxies for data flow. |
| Inspector / Grab Proxies | ValueProxy<T>, ReferenceProxy, AssetProxy<T>, DelegateProxy<T> |
Make grabbable objects act as values, references, or assets for the in-game inspector's drag-and-drop system. |
| Lifecycle Proxies | DestroyProxy, SaveProxy |
Redirect destroy or save operations to a different target slot. |
| ProtoFlux Internal Proxies | MethodProxy, FunctionProxy, AsyncMethodProxy, ProtoFluxRefProxy, ProtoFluxGlobalRefProxy, ProtoFluxReferenceProxy, FieldDriveBase+Proxy, ReferenceDrive+Proxy, … |
Internal ProtoFlux node machinery (thousands of variants). Not user-facing. Includes nested +Proxy classes that drive nodes create on target slots. |
+Proxy mean? In .NET, the + symbol denotes a nested class. FieldDriveBase<T>+Proxy is a Proxy class nested inside FieldDriveBase<T>. ProtoFlux drive nodes (like FieldDrive, ReferenceDrive, PlaybackDrive) use these nested proxy components internally — they get placed on the target slot to perform the actual drive operation.
The rest of this section focuses on ProtoFlux Data Proxies, since they are central to understanding how data flows through the system.
ProtoFlux Data Proxies
(e.g. DVV.Value)"] -->|"reference"| PC["Data Proxy
(GlobalReference / GlobalValue)"] PC -->|"read / write"| CF PC -->|"source / variable"| PF["ProtoFlux Node
(ValueSource / ValueWrite)"] PF -->|"write back"| PC style CF fill:#2a5a3a,stroke:#4ec9b0,color:#fff style PC fill:#4a3a6a,stroke:#c586c0,color:#fff style PF fill:#3a4a6a,stroke:#569cd6,color:#fff
GlobalReference<T> vs GlobalValue<T>
GlobalReference<T>
Points to an existing field. A "window" into the data model. This is the most common data proxy — it doesn't store data itself, it references data that lives elsewhere.
Example: A GlobalReference<IValue<float>> pointing at a DVV<float>'s Value field lets a ValueSource<float> node read that DVV.
GlobalValue<T>
Stores its own constant value. A "constant" exposed to ProtoFlux. No external reference needed — the value lives directly on this component.
Example: A GlobalValue<float> set to 9.81 provides a gravity constant that any ProtoFlux node can read.
GlobalReference<T> and GlobalValue<T> implement IGlobalValueProxy<T>. ProtoFlux node inputs (like ValueSource.Source) expect this interface, which is why either data proxy type can satisfy them.
| GlobalReference<T> | GlobalValue<T> | |
|---|---|---|
| Stores | A pointer to another field | Its own value |
| Use when | Reading/writing dynamic data (DVVs, ValueFields, Grabbables, Buttons) | Providing a constant to ProtoFlux |
| Common with | ValueSource, ObjectValueSource, ValueWrite, ObjectWrite, ButtonEvents, OnGrabbableGrabbed | Any PF node needing a fixed input |
7. Links vs Drives
Two mechanisms control field values in Resonite. They look similar but behave very differently.
| Link (cyan) | Drive (purple) | |
|---|---|---|
| Indicator | Cyan/teal field highlight | Purple field highlight |
| Network sync | Yes — value is synced to all users | No — computed locally on each client |
| Persistence | Value saved with the world | Value NOT saved (recomputed on load) |
| Who computes | The writing client | Every client independently |
| Editable? | No (overwritten by link source) | No (overwritten by driver) |
| Set by | ValueCopy, ReferenceCopy | ValueDriver, ValueMultiDriver, ProtoFlux drives |
| Use when | You want the result synced to everyone | You want local computation (animations, UI states) |
8. ProtoFlux & the Data Model
ProtoFlux is Resonite's visual programming system. It operates in its own execution context but reads from and writes to the component data model via bridge components.
GlobalReference component. You must manually add it and wire the reference. The in-game node browser does this automatically, but the API doesn't.
The Bridge Pattern
Every ProtoFlux node that reads/writes the data model follows the same pattern:
- A
GlobalReference<T>component on the node's slot points to a target field - The PF node has a member (e.g.
Source,Variable) that references the GlobalReference - At runtime, the node reads/writes through the GlobalReference to the actual field
9. Data Flow Patterns
Common wiring patterns you'll encounter and create in Resonite.
Pattern 1: DVV → Driver → UI
A DynamicValueVariable drives a UI text element. Change the DVV value, and the text updates automatically.
VariableName: 'score'
Value: '42'"] VD["ValueDriver<string>
Source: DVV.Value"] TXT["Text Component
Content (driven)"] DVV -->|"Value field"| VD VD -->|"drives"| TXT style DVV fill:#1a472a,stroke:#4CAF50 style VD fill:#2a1a47,stroke:#9C27B0 style TXT fill:#1a2a47,stroke:#42A5F5
Pattern 2: DVV → GlobalRef → ProtoFlux Read
ProtoFlux reads a DynamicValueVariable through a GlobalReference bridge.
Value field"] GR["GlobalReference<IValue<string>>
Reference → DVV.Value"] OVS["ObjectValueSource<string>
Source → GlobalRef"] PF["Rest of
ProtoFlux Graph"] DVV -.->|"field ID"| GR GR -->|"provides"| OVS OVS -->|"output"| PF style DVV fill:#1a472a,stroke:#4CAF50 style GR fill:#472a1a,stroke:#FF9800 style OVS fill:#471a2a,stroke:#E91E63 style PF fill:#1a2a47,stroke:#42A5F5
Pattern 3: ProtoFlux → Write → DVV
ProtoFlux writes a computed value back to a DynamicValueVariable.
Computation"] OW["ObjectWrite<string>
Variable → GlobalRef"] GR["GlobalReference<IValue<string>>
Reference → DVV.Value"] DVV["DynamicValueVariable<string>
Value updated"] PF -->|"impulse + value"| OW OW -->|"writes via"| GR GR -.->|"targets"| DVV style PF fill:#1a2a47,stroke:#42A5F5 style OW fill:#471a2a,stroke:#E91E63 style GR fill:#472a1a,stroke:#FF9800 style DVV fill:#1a472a,stroke:#4CAF50
string is a value type in FrooxEngine but an object type in ProtoFlux — use ObjectWrite<string> (not ValueWrite<string>) in ProtoFlux. Use ValueWrite for float, bool, int, etc.
10. Wiring Guide
The previous sections describe what each component is. This section explains how to wire them in the Resonite inspector — what goes in those null fields and what to drag where.
Fields Are the Unit of Reference
Every field on every component has a unique internal ID used by the data model. When you wire a ValueDriver's ValueSource to a DVV's Value, you're pointing at that specific field — not at the DVV component as a whole.
This means you can wire any field of the correct type to any compatible target, regardless of which component it lives on.
Inspector Color Coding
Field highlight colors tell you what's controlling a field:
| Color | Meaning | Editable? |
|---|---|---|
| White (none) | Normal, locally set value | Yes |
| Cyan / Teal | Linked (ValueCopy, network-synced) | No |
| Purple | Driven (ValueDriver, local compute) | No |
The small circles (○) next to each field in the inspector are reference handles — grab-and-drop targets. Drag from one ○ and drop onto another to create a reference.
ValueDriver<T> — Step by Step
e.g. DVV.Value"] VD_SRC["ValueDriver.ValueSource
expects IValue<T>"] VD_TGT["ValueDriver.DriveTarget
expects IField<T>"] TGT["Target Field
e.g. Text.Content"] SRC -->|"drag ○ → drop"| VD_SRC VD_TGT -->|"drag ○ → drop"| TGT style SRC fill:#1a472a,stroke:#4CAF50,color:#fff style VD_SRC fill:#2a1a47,stroke:#9C27B0,color:#fff style VD_TGT fill:#2a1a47,stroke:#9C27B0,color:#fff style TGT fill:#1a2a47,stroke:#42A5F5,color:#fff
- Attach
ValueDriver<T>to any slot - ValueSource field: grab the ○ next to the source field (e.g. DVV's
Value) and drop it here — expectsIValue<T>(see §5) - DriveTarget field: grab the ○ next to the target field (e.g. Text's
Content) and drop it here — expectsIField<T>(see §5) - The target field turns purple = it's now driven
Common sources for ValueSource: DynamicValueVariable.Value, ValueField.Value, any typed member on any component.
ValueMultiDriver<T> — One to Many
Same as ValueDriver, but DriveTarget is a list. Each entry drives a different target field. Useful for broadcasting one value (e.g. a color) to many receivers.
- Set
ValueSourceto the single source field - Add entries to the
DriveTargetlist — each entry takes a ○ reference to a target field - All targets turn purple
ValueCopy<T> vs ValueDriver<T>
| ValueCopy | ValueDriver | |
|---|---|---|
| Source field type | Another existing field (IField<T>) | IValue<T> interface |
| Result color | Cyan link (synced, saved) | Purple drive (local, not saved) |
| Network sync | Yes — value replicated to all users | No — each client computes independently |
| Use when | You want the value synced to all users | You want local computation |
ProtoFlux Wiring — The GlobalReference Bridge
ProtoFlux nodes don't reference data fields directly. They go through a GlobalReference on the same slot.
Reading a Value into ProtoFlux
(the actual data)"] GR_REF["GlobalReference.Reference
drag DVV.Value ○ here"] VS_SRC["ValueSource.Source
→ points to GlobalRef comp"] PF["ProtoFlux Graph
receives value"] DVV_VAL -->|"drag ○ → drop"| GR_REF GR_REF -.->|"provides"| VS_SRC VS_SRC -->|"output"| PF style DVV_VAL fill:#1a472a,stroke:#4CAF50,color:#fff style GR_REF fill:#472a1a,stroke:#FF9800,color:#fff style VS_SRC fill:#471a2a,stroke:#E91E63,color:#fff style PF fill:#1a2a47,stroke:#42A5F5,color:#fff
- The ProtoFlux node (e.g.
ValueSource) has aSourcefield - That field expects a
GlobalReferenceon the same slot - The GlobalReference's
Referencefield points to the actual data field (e.g. DVV.Value) - In the inspector: drag DVV.Value's ○ → drop onto
GlobalReference.Reference
Writing from ProtoFlux
impulse + value"] OW_VAR["ObjectWrite.Variable
→ points to GlobalRef comp"] GR_REF2["GlobalReference.Reference
drag DVV.Value ○ here"] DVV_VAL2["DVV.Value
(receives written data)"] PF -->|"impulse"| OW_VAR OW_VAR -.->|"writes via"| GR_REF2 GR_REF2 -->|"drag ○ → drop"| DVV_VAL2 style PF fill:#1a2a47,stroke:#42A5F5,color:#fff style OW_VAR fill:#471a2a,stroke:#E91E63,color:#fff style GR_REF2 fill:#472a1a,stroke:#FF9800,color:#fff style DVV_VAL2 fill:#1a472a,stroke:#4CAF50,color:#fff
- The ProtoFlux node (e.g.
ObjectWrite) has aVariablefield (not "Target"!) - Wire
Variable→GlobalReferenceon same slot - Wire
GlobalReference.Reference→ target field (e.g. DVV.Value)
Quick Reference: What to Drop in Each "null" Field
| Component | Field | What to Drop Here | Target Turns… |
|---|---|---|---|
ValueDriver<T> | ValueSource | Any field of type T (○ handle) | — |
ValueDriver<T> | DriveTarget | The field you want driven | Purple |
ValueMultiDriver<T> | DriveTarget [n] | Each field you want driven | Purple |
ValueCopy<T> | Source | Any field of type T | — |
ValueCopy<T> | Target | The field you want linked | Cyan |
GlobalReference<T> | Reference | The data model field to bridge | — |
ValueSource<T> (PF) | Source | GlobalReference on same slot | — |
ObjectWrite<T> (PF) | Variable | GlobalReference on same slot | — |
11. Which Component Do I Need?
Use this flowchart to find the right data component for your use case.
name for lookup?"} Q1 -->|"Yes"| Q2{"Scope?"} Q1 -->|"No"| Q3{"Purpose?"} Q2 -->|"Within a slot subtree"| DVV["DynamicValueVariable
or DynamicReferenceVariable
+ DynamicVariableSpace"] Q2 -->|"Across worlds/sessions"| CLOUD["CloudValueVariable
Persistent, cloud-stored"] Q3 -->|"Simple field storage"| Q4{"Value or Reference type?"} Q3 -->|"Drive another field"| Q5{"One target or many?"} Q3 -->|"Bridge to ProtoFlux"| Q6{"Read or Write?"} Q3 -->|"PF-local state"| STORED["StoredValue / StoredObject
Lives in PF graph only"] Q4 -->|"Value (bool, float, string, etc.)"| VF["ValueField<T>"] Q4 -->|"Reference (Slot, User, etc.)"| RF["ReferenceField<T>"] Q5 -->|"One"| VDRIVER["ValueDriver<T>"] Q5 -->|"Many"| VMDRIVER["ValueMultiDriver<T>"] Q6 -->|"Read from data model"| Q7{"Value or Reference type?"} Q6 -->|"Write to data model"| Q8{"Value or Reference type?"} Q7 -->|"Value"| VSRC["ValueSource<T>
+ GlobalReference"] Q7 -->|"Reference"| OVSRC["ObjectValueSource<T>
+ GlobalReference"] Q8 -->|"Value"| VW["ValueWrite<T>
+ GlobalReference"] Q8 -->|"Reference"| OW["ObjectWrite<T>
+ GlobalReference"] style START fill:#1a2a47,stroke:#42A5F5,color:#fff style DVV fill:#1a472a,stroke:#4CAF50,color:#fff style CLOUD fill:#1a3a4a,stroke:#00BCD4,color:#fff style VF fill:#2a2a1a,stroke:#FFEB3B,color:#fff style RF fill:#2a2a1a,stroke:#FFEB3B,color:#fff style VDRIVER fill:#2a1a47,stroke:#9C27B0,color:#fff style VMDRIVER fill:#2a1a47,stroke:#9C27B0,color:#fff style VSRC fill:#471a2a,stroke:#E91E63,color:#fff style OVSRC fill:#471a2a,stroke:#E91E63,color:#fff style VW fill:#47331a,stroke:#FF9800,color:#fff style OW fill:#47331a,stroke:#FF9800,color:#fff style STORED fill:#333,stroke:#999,color:#fff
12. .NET Naming Conventions
Resonite is built on .NET (C#). Component type strings follow .NET assembly-qualified naming, but with a Resonite-specific format.
Anatomy of a Type String
Assembly Prefixes
| Prefix | Contains | Examples |
|---|---|---|
[FrooxEngine] |
Core engine components, UIX, materials, data types | BoxMesh, Canvas, PBS_Metallic, DynamicValueVariable |
[ProtoFluxBindings] |
ProtoFlux execution nodes | ButtonEvents, ValueWrite, SetLocalPosition |
Generic Syntax Rules
| Correct (Resonite) | Wrong (CLR) |
|---|---|
DynamicValueVariable<string> | DynamicValueVariable`1[System.String] |
ValueField<float3> | ValueField`1[BaseX.float3] |
ValueField<bool> | ValueField`1[System.Boolean] |
Common Generic Type Arguments
value = value type ref = reference type
Note: string and Uri are value types in FrooxEngine but object types in ProtoFlux (use ObjectWrite, not ValueWrite).
13. API Quick Reference
Member $type Formats
When updating component members via the API, values must include a $type discriminator.
| $type | Shape | Example |
|---|---|---|
bool | { $type, value } | { "$type": "bool", "value": true } |
int | { $type, value } | { "$type": "int", "value": 42 } |
float | { $type, value } | { "$type": "float", "value": 0.5 } |
string | { $type, value } | { "$type": "string", "value": "hello" } |
float2 | { $type, value: {x,y} } | { "$type": "float2", "value": { "x": 1, "y": 2 } } |
float3 | { $type, value: {x,y,z} } | { "$type": "float3", "value": { "x": 1, "y": 2, "z": 3 } } |
floatQ | { $type, value: {x,y,z,w} } | { "$type": "floatQ", "value": { "x": 0, "y": 0, "z": 0, "w": 1 } } |
colorX | { $type, value: {r,g,b,a,profile?} } | { "$type": "colorX", "value": { "r": 1, "g": 0, "b": 0, "a": 1 } } |
enum | { $type, value, enumType } | { "$type": "enum", "value": "Alpha", "enumType": "BlendMode" } |
reference | { $type, targetId } | { "$type": "reference", "targetId": "Reso_12345" } |
Component Type Strings by Category
UIX Components
Materials
Meshes
Rendering
Interaction
Data & Variables
ProtoFlux Nodes
Common Gotchas
MeshRenderer.Materials) do NOT support dot-notation access. Materials.0 fails. Use the list assignment pattern instead.
ValueField, DynamicValueVariable) but object types in ProtoFlux (ObjectWrite, ObjectValueSource). Don't look for ValueWrite<string> in ProtoFlux — it doesn't exist.
GlobalReference<T> companion component and wire it.
Variable, not Target.
External Resources
Official and community references covering topics discussed in this guide:
Official Resonite Wiki
- Data Model — core data model overview (worlds, slots, components, fields, event propagation)
- Architecture Overview — engine architecture, networking primitives, persistence
- Components — component fundamentals
- Linkage — links vs drives, driven fields, inspector color coding
- Value Types — value type categories and usage
- Reference Types — reference type categories
- Interface Types — type casting and interface usage
- Dynamic Variables — DynamicValueVariable, variable spaces, reading/writing
- ValueField Component — storing single values on slots
- DynamicValueVariable Component — component reference page
- ValueCopy Component — copying values between fields
- GlobalValue Component — GlobalReference/GlobalValue for ProtoFlux bridging
- ProtoFlux — visual programming overview
- Complex Types in Components — .NET type naming, generics syntax