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.
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.
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.
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.
The production source is proprietary. The diagrams and code above are illustrative; all screenshots and the real pipeline belong to Klang Games GmbH.