On…A collection of How-Tos and What-Nots…
← Projects

DataPipeline

A modular Unreal Engine plugin for fetching, parsing, and routing external data to actors at runtime — REST APIs, files, JSON, CSV, all on one composable four-stage pipeline. Ships with a Flask test server that simulates Cray-style HPC telemetry.

Active·since

DataPipeline
datapipeline
Connect external data to actor logic using DataPipeline Plugin

What it is. An Unreal Engine plugin that fetches external data, parses it, maps it to actors, and updates them at runtime — all through a single composable pipeline you configure with components in the editor. DataPipeline brings the live data to the things in the scene and is application agnostic, so let your creativity run wild!*

Why. Every interactive Unreal app eventually needs to talk to something outside itself — a REST endpoint, a CSV log, a telemetry feed. The recurring pattern is “fetch a thing, parse a thing, find the actor that cares about a key in the thing, update a property.” DataPipeline is that recurring pattern factored into a four-stage pipeline so you configure it once and forget it.

The four-stage pipeline

Stage Role Modules
Transport fetch raw data UHttpTransport (REST with Bearer / Basic / API Key) · UFileTransport (local files, auto-detects text vs binary)
Schema parse string → typed records UJsonSchema (nested paths, field mappings, transforms) · UTextSchema (CSV / TSV / key-value)
Resolver match each record to actors UDirectResolver (exact / wildcard / prefix / suffix / contains pattern matching) · UActorIDResolver (match by ID) · UDataResolverManager (coordinate multiple resolvers)
Update Strategy send the typed value UInterfaceUpdate (calls IDataPipelineInterface on the matched actor — single or batched)

A pipeline is built by dropping a UDataPipelineManager component on any actor and assigning one module per stage. Run it in Manual mode (call FetchOnce() when you want) or Polling mode (automatic interval). Mix and match — the schema doesn’t know which transport is upstream, the resolver doesn’t know which schema produced it.

On the receiving end

Target actors implement IDataPipelineInterface and react to the mapping:

void AMyActor::ReceiveUpdateMapping_Implementation(const FPropertyActorMapping& Mapping)
{
    if (Mapping.PropertyKey == "temperature")
    {
        Temperature = Mapping.Value.ToNumber();
    }
}

A realistic test rig in the box

DataPipeline ships with a Flask-based HTTP test server under ExternalAssets/scripts/ that generates synthetic HPC telemetry — nodes, chassis, cabinets — using Cray-style xnames (the hardware naming convention used in HPE Cray supercomputers like ORNL’s Frontier). It exposes /api/nodes, /api/chassis, /api/cabinets, and /api/hierarchy endpoints you can wire a UHttpTransport at.

A driver script orchestrates server + polling + snapshot/streaming capture, so you can prove a pipeline end-to-end with realistic high-performance-computing data shapes before pointing it at a real telemetry source.

Example payloads are committed under ExternalAssets/exampleData/ in four formats — JSON, CSV, key-value, regex-style text — so each schema has a reference input to test against.

Extending

Each stage parents a U… base class — UTransport, USchema, UResolver, UUpdateStrategy. Need GraphQL? Subclass UTransport. Need protobuf? Subclass USchema. The plugin’s abstraction shape doesn’t change; the rest of the pipeline composes around the new module.