Skip to main content
Jeremias Meister - Tools & Pipeline
SEED Asset Integration Pipeline

SEED Asset Integration Pipeline

AIP: a tool ecosystem that carries art from DCC to a live game across five platforms, unified by a single ArtObject abstraction.

Overview

The SEED Asset Integration Pipeline (AIP) moves art from where it is made to where it is played. A mesh starts as a .blend file in Blender or .ma file in Maya; it ends up streamed into the live game on Windows, Mac, Android and IOS from a CDN.

010203040506Source art
Blender · Maya
ArtObject
asset + metadata
Unity author
import · prefab · LOD
Addressables
bundles per catalog
CDN
Google Cloud
Seed runtime
streamed in
The AIP itself acts linearly and self-healing due to early adaption of standards in the ArtObject.

The abstraction of the assets into an ArtObject ties the entire pipeline together. It allows artists to control how an asset is integrated and consumed by the game.

My role: I designed and built the base and the majority of the AIP and maintain it actively. Like most of our pipeline it is a collaborative effort across the Technical Art team.

The ArtObject

Every asset, roughly 3,450 of them at the time of writing, is an ArtObject: the file plus a JSON sidecar file of metadata. Those metadata keys are the contract every downstream tool reads.

Source fileMetadata (.json)ThumbnailArtObjectUnity importAssetReferenceIdGameType links
One file, its metadata and a thumbnail in; the Unity import, the runtime identifier and the game-type links out.

Because the metadata is uniform, artists can search thousands of assets like a database, in plain text using a SQL-like syntax:

type == mesh  &&  category ?= building  &&  modified >> 2024/08/01

In the Sapling

The Sapling is the desktop tool where artists work: fetch what already exists, and define new assets. Everything they author becomes an ArtObject in version control.

Under the hood, the Sapling does not export files and hope Unity notices them. It drives a live Unity Editor over a local socket, pushing only the ArtObjects that changed and reading the log back:

# Illustrative: push the changed ArtObjects into a running Unity Editor
def run_in_unity(command: str, payload: dict) -> str:
    with socket.create_connection(("127.0.0.1", 12345)) as unity:
        unity.sendall(json.dumps({"command": command, "args": payload}).encode())
        return unity.recv(65536).decode()   # Unity runs it, streams the log back

changed = [a for a in art_objects if a["HAS_CHANGED"]]
run_in_unity("ImportAssets", {"objects": [a["ID"] for a in changed]})

Nightly GitHub builds

A scheduled GitHub Actions pipeline picks up the latest PlasticSCM changeset, integrates it, builds content for every platform, and bumps the catalog versions the game reads. This happens automatically every night or whenever we need a new content version.

0102030405Nightly build
schedule · on-demand
Integrate
latest changeset
Build
every platform
Version update
catalogs bumped
CDN
served to players
A scheduled pipeline: integrate the latest changeset, build every platform, bump the catalog versions, serve from the CDN.

The Seed runtime streams only what a scene needs, resolving each asset by its identifier. We have completely different build projects and consumer projects setup to keep the client lean.

Assets streamed into the world of SEED
Authored assets, streamed into the world of SEED.

The production source is proprietary. The diagrams and code above are illustrative; all screenshots and the real pipeline belong to Klang Games GmbH.