Skip to content

Procedural Graphs

A procedural graph is a node graph saved as a .hpodgraph file. Depending on its type, a graph builds a mesh, poses a robot or a character, or produces sound. Every procedural graph opens in the same graph editor, and the values you choose to expose become parameters that each placed copy can tune on its own.

Geometry graphs are placed in a scene with the Procedural Mesh component. The marble run in the bundled Welcome scene is built this way: select any track piece to see its parameters in the Inspector.

In short

Start from a primitive (Scene Hierarchy → Create → 3D → Procedural Cube), or create a graph in the Content Browser with New → Procedural Graph. Double-click a .hpodgraph file to open it in the graph editor. Expose the values you want to tune as parameters: every Procedural Mesh that uses the graph then lists them in the Inspector, where each copy can override them. Robot motion graphs, animation graphs and audio graphs are procedural graphs too.

Graph types

Type How to create it Where it is used
Geometry New → Procedural Graph → Geometry. Starts as a cube The Graph field of a Procedural Mesh component
Simulation New → Procedural Graph → Simulation. Starts with only its output node The Graph field of a Procedural Mesh component. Its result can change over time while the scene plays
Motion New → Procedural Graph → Motion, or New → Motion Graph. Starts with only its output node The Motion Graph field of a Robot Controller. See Motion graphs for robots
Animation New → Animation Graph, or the mesh source wizard's Default Animation Graph The Animation Graph field of an Animation component. See Animation graphs
Audio New → Procedural Graph → Audio. Starts with a quiet, continuous tone The Source of a Sound Config. See Audio graphs

The New → Procedural Graph menu also lists graph types that this guide does not cover.

The Inspector in this guide is the list of components shown below the entity tree in the Scene Hierarchy panel. See The editor interface.

Procedural primitives

The quickest way to start is a primitive: a ready-made shape whose settings you edit directly in the Inspector.

  1. In the Scene Hierarchy, right-click and choose Create → 3D.
  2. Below the separator, pick Procedural Cube, Procedural Sphere, Procedural Plane, Procedural Cylinder, Procedural Cone, Procedural Torus, Procedural IcoSphere, Procedural Capsule or Procedural Lucky Logo.
  3. Select the new entity. Its Procedural Mesh component shows Primitive, the kind of shape, followed by that shape's settings.

Add Component → Procedural Mesh on an existing entity adds a cube primitive.

Primitive Shape settings
Cube Size X, Size Y, Size Z
Plane Size X, Size Z
Sphere Radius, Segments, Rings
Cylinder Radius, Height, Sides, Cap Fill
Cone Bottom Radius, Top Radius, Height, Sides, Cap Fill
Torus Major Radius, Minor Radius, Major Segments, Minor Segments
IcoSphere Radius, Subdivisions
Capsule Radius, Cylinder Height, Segments, Hemisphere Rings
Lucky Logo Depth, Segments

Cap Fill chooses how the flat ends are closed: Ngon, Fan or None.

Every primitive also has these two settings:

Field Values Description
Shading Default, Smooth, Flat, Smooth by Angle How the surface is shaded. Smooth by Angle adds a Smooth Angle field: edges sharper than this angle stay crisp
Output Role Render, Collision, Both Render is visible only. Collision is collidable only and is not drawn. Both is visible and collidable

The General section below holds the options described in Per-instance settings.

Promote to Graph

A primitive's shape is fixed to the settings above. To change how it is built, turn it into a graph of its own:

  1. Select the primitive and click Promote to Graph in its Procedural Mesh component.
  2. The editor saves the shape as <Entity Name> Graph.hpodgraph in the project's Assets folder, switches the Procedural Mesh to that graph, and opens it in the graph editor.

The shape settings and Output Role become exposed parameters of the new graph, so they still appear in the Inspector. Shading comes along when it was set to something other than Default, and Smooth Angle when it was set to Smooth by Angle.

Creating a graph

In the Content Browser, right-click an empty area and open New:

Menu item Creates
Procedural Graph → Geometry, Simulation, Motion or Audio New <Type> Graph.hpodgraph, in a Graphs subfolder of the current folder. The subfolder is created if needed
Motion Graph New Motion Graph.hpodgraph in the current folder
Animation Graph New Animation Graph.hpodgraph in the current folder

Double-click the new file to open it in the graph editor. A new graph is not empty:

  • A Geometry graph starts as a cube.
  • An Audio graph starts with an Audio Stream block that plays a quiet, continuous tone into the audio output.
  • Simulation and Motion graphs start with only their output node.
  • An Animation Graph starts with a Rest Pose input wired to an Animation Pose output.

To use an existing graph in a scene, drag the .hpodgraph file from the Content Browser into the viewport. The editor creates an entity named after the file, with a Procedural Mesh component that uses the graph.

The graph editor

Double-click a .hpodgraph file in the Content Browser to open it. The graph editor opens as a tab in the main area of the editor, titled with the file name. It has three parts: a toolbar along the top, the node canvas, and a side panel with a 3D preview above an inspector.

Toolbar

Control What it does
Save graph Saves the graph. Available while there are unsaved changes
Auto-arrange the graph Opens a menu of layouts: Dataflow (Layered), Dataflow (Compact), Dataflow (Tuck Inputs), Columns by Width and Grid. Parameters Stick to Left pins every exposed parameter to one column on the far left
Eye icon Hides chains of expression and math nodes, and draws dotted links from each parameter to the nodes it influences
Link icon Available while the eye icon is on. Hides parameter nodes altogether and marks the input sockets they drive in the parameter colour
saved / unsaved Whether the graph has unsaved changes, followed by the node and link count
Preview toggle Shows or hides the 3D preview, giving the inspector the whole side panel
Side panel toggle Shows or hides the side panel. Drag the panel's left edge to resize it

When you are inside a group, the toolbar also shows a breadcrumb, starting at root. Click a level to go back to it.

Building a graph on the canvas

Action How
Add a node Right-click an empty part of the canvas, or press Shift+A. Type in the Add Node search box, use Up and Down to pick a result, and press Enter
Connect two nodes Drag from an output socket to an input socket
Add a node that connects to a socket Drag a link from a socket and release it on empty canvas. Add Node then lists only nodes that fit, and wires the new node up
Cut links Hold Ctrl and drag with the right mouse button across the links
Pan Drag with the middle mouse button, or hold Shift and drag with the right mouse button
Zoom Scroll the mouse wheel
Fit the view F fits every node in view, or centres on the selection
Rename a node F2, or the Name field at the top of the node's right-click menu
Copy, duplicate, paste Ctrl+C, Ctrl+D, Ctrl+V
Delete a node Del removes the node and its links. Backspace removes the node and reconnects the links that passed through it
Undo Ctrl+Z

Right-click a node for its menu:

Item What it does
Copy, Duplicate, Paste, Delete As the shortcuts above
Wrap in Frame (Shift+F) Draws a frame around the selected nodes
Add to Frame, Remove from Frame Adds the node to the frame it sits on, or takes it out
Collapse to Group On a frame: turns its contents into a group
Group selection (Ctrl+G) With two or more nodes selected: folds them into a single group node
Open graph On a group: shows its contents. Double-clicking the group does the same, and Esc goes back out
Ungroup Puts a group's nodes back into the surrounding graph
Extract to Group… Saves the group to its own file next to the graph
Show in Frame Turns a group back into a frame of its nodes

The items for exposing parameters are described in Exposing parameters. Some nodes add further items of their own.

Preview

The preview shows the graph's current result. Drag with the left mouse button to orbit, the middle mouse button to pan, and scroll to zoom. Hold the right mouse button to fly, as in the scene viewport. Press F over the preview to reset the view.

The icons in the preview's top-left corner toggle Ground grid, Scene lighting, Wireframe overlay (with a choice of Quads, Triangles or Both), Solid mesh, Collision mesh and Normals (Per Face, Per Triangle or Per Vertex).

Audio and animation graphs preview differently. See Audio graphs and Animation graphs.

Side panel inspector

Tab Contents
Node The settings of the selected node
Parameters Every exposed parameter, listed by its full name. Editing a value here changes the graph's own default
Blend Space Shown only when the graph contains a blend space

Saving

A tab with unsaved changes shows a dot, and the toolbar reads unsaved. Procedural Mesh components that use the graph update as you edit it, before you save.

Save with the Save graph button, or right-click the tab and choose Save. Ctrl+S saves the open scene, not the graph. If you close the tab, open another project or quit with unsaved changes, the editor asks whether to save them, with Save, Don't Save and Cancel.

The tab's right-click menu also has Show in Explorer, Show in Content Browser, Open Externally, Copy Full Path, Copy File Name and Close.

Exposing parameters

Only exposed parameters appear in the Inspector, and only they can be changed per instance or from a script. There are two ways to expose one:

  • A Value node. Right-click it and choose Add Parameter. The node's name becomes the parameter name. Remove Parameter undoes this.
  • An input of any other node. Right-click the node and choose Expose Input as Parameter → the input, or Expose All N Inputs as Parameters. The editor adds a Value node for each input and exposes it. Only inputs without a link are offered.

The right-click menu of a node with exposable inputs also has a Group field. It starts with the node's name. Exposed inputs are named <Group> / <Input>, for example Bevel Edge / Offset. Clear the field to expose them without a group.

The parameter name controls how the Inspector lays the parameters out:

Name Shown in the Inspector as
Length A row named Length, before any folder
Straight / Length A row named Length in a collapsible Straight folder
Track / Profile / Width A row named Width under a Profile divider in the Track folder

Number, whole-number, vector, checkbox, menu, colour and text parameters are all supported. A description written for a parameter in the graph shows as its tooltip in the Inspector.

Parameter names are what scripts use

Scripts address a parameter by its full name, including the folder, exactly as the graph editor's Parameters tab lists it. Choose names you are happy to keep. See Changing Procedural Graph Parameters from Scripts.

Tuning a placed graph

Select an entity with a graph-backed Procedural Mesh to see its settings in the Inspector. The Graph field shows which .hpodgraph it uses. Drop a different graph on it to swap.

Parameters

The Parameters section lists the graph's exposed parameters. Changing a value here affects this entity only. The graph file is not touched.

  • A parameter whose value differs from the graph's default has its name tinted amber.
  • To go back to the default, right-click the value and choose Reset to Default. Number and vector values also show an undo-arrow button next to them (Reset to asset default). Setting the value back to the default by hand does the same.
  • With several Procedural Meshes selected, an edit applies to all of them.
  • Values the instance does not override follow the graph's defaults, including changes made later in the graph editor's Parameters tab.

If the graph has no exposed parameters, the section says so and suggests opening the graph to expose some.

Per-instance settings

The General section holds options that apply to this entity only:

Field Description
Convex Decomposition Decomposes this instance's collision meshes into convex hulls. Shown only when the graph produces collision, and only used for collision meshes: collision shapes that are already convex are left as they are
Invisible to Cameras Hides the procedural mesh from scene cameras, previews and recordings, including its shadows and reflections. It stays visible in the editor's viewports, and its physics still works
Attachments Follow Bodies Graphs only, not primitives. While the graph changes, entities you attached to its generated bodies keep their offsets to those bodies. When off, they keep their world position
Disable Graph Lights Graphs only, not primitives. Leaves out the lights the graph generates. Other lights in the scene are unaffected

Materials

The Materials section lists the material slots of the graph's mesh, with the materials the graph generates as defaults. Assign a Material asset to a slot to override it for this entity. On an articulated graph, each body's Generated Mesh component has a Materials section of its own, which overrides a material for that body only.

Generated lights

A graph can generate lights. Each one appears as a child entity, named for example Generated Point Light 1, with a read-only Generated Light component next to an ordinary light component. Edit the light's properties to override them for this instance. Properties you do not edit, and the light's transform, keep following the graph. Reset to Graph in the light component's settings menu clears the overrides.

Advanced settings

With Show Advanced Component Settings turned on in Settings → Application → Editor, the Procedural Mesh also shows a Diagnostics section.

Physics

A Procedural Mesh takes part in MuJoCo physics when its graph produces collision geometry:

  • For a primitive, set Output Role to Collision or Both.
  • For a graph, the graph decides. A promoted primitive keeps Output Role as a parameter.

The editor then adds a MuJoCo Mesh Collider component to the entity and keeps it in step with the graph. If you add your own MuJoCo Mesh Collider with a mesh assigned, the editor leaves it alone.

Articulated graphs

A graph can describe several bodies connected by joints. The editor then builds a child entity for each body, named after the body, with MuJoCo joints and colliders. Below each body entity, an entity named <body>_Render has a Generated Mesh component that shows the body's part of the mesh. The Procedural Mesh shows a banner saying the graph is articulated, and two extra controls:

  • Re-bake Articulation rebuilds the body entities, for example after editing the graph.
  • Articulation Preview has an Enable preview checkbox, a Reset to rest button and a slider for each joint, in metres for sliding joints and radians for hinges. The preview only moves the bodies in the viewport. It changes neither the rest pose nor the state the simulation starts from.

Re-bake removes every child entity

Re-bake Articulation deletes all child entities of the procedural mesh before it builds the bodies again. Keep entities of your own outside its hierarchy.

The joints and colliders of the body entities are read-only in the Inspector: a banner in each body's MuJoCo Joint Component and MuJoCo Compound Collider says their values come from the graph. A body has a MuJoCo Compound Collider when the graph builds its collision from primitive shapes.

To make these values editable, select the body and click Promote N joint inputs to parameters or Promote N collider inputs to parameters in that component. The editor exposes the matching inputs of the graph as parameters, in a folder named after the body under a Joint or Collider divider. It then saves the graph and selects the procedural mesh, whose Parameters section lists the new parameters. Once all of them are promoted, the button is greyed out and reads Joint inputs promoted to parameters or Collider inputs promoted to parameters.

Promoting changes the graph file itself, so every procedural mesh that uses the graph gets the new parameters. Each one can then override them on its own, as described in Parameters.

Cables

A graph can also build cables that bend and hang under MuJoCo physics. Each cable appears as a child entity with a Cable Attachments and a Cable Jacket component. Their settings come from the graph, and the components say so: to change a cable per instance, expose the inputs that build it as parameters.

Playing a scene

Physics is fixed while playing

The physics of the scene is set up when you press Play. A procedural mesh's collision and bodies stay as they were at that moment until the next Play, and scripts cannot change the parameters of a procedural mesh with collision or bodies while the scene plays. Make those changes in Edit mode.

Before the scene starts, the editor finishes building every procedural mesh in it. If a graph is still being prepared, or has errors, the scene does not start and a notification reads Cannot start Play: procedural graph preparation is incomplete or failed. Wait a moment, or open the graph and fix it, then press Play again.

Motion graphs for robots

A robot's motion graph is a Motion graph assigned to the Motion Graph field of its Robot Controller. It drives the robot's joints, for example to move an arm's hand to a target with inverse kinematics. The graph's exposed values become inputs that you can set per robot in the Inspector, and from scripts.

To drive a robot, a Motion graph needs a pose output and an input that reads the robot's pose, named Asset, Current Pose, Rest Pose or Start Pose. A new Motion graph has only its output node, so it does not drive a robot yet. The quickest start is the motion graph of a robot pack: the bundled Panda pack in the Welcome project, under Assets/ContentVault/Robots/Panda, includes MG_Panda_Pod_IK.hpodgraph (inputs TargetPosition in metres, TargetOrientation as Euler angles in degrees, Duration in seconds, and Start) and MG_TwoPandas.hpodgraph for the two-arm model.

Assigning a motion graph, editing its inputs per robot, and combining it with trained policies are covered in Robots → Adding policies and motion graphs. Setting the inputs from C# is covered in Controlling robots.

Animation graphs

An animation graph drives the bones of a skinned character. It is a Motion graph made for a character rather than a robot.

  • When the mesh source wizard creates a dynamic mesh with a Default Animation Graph, the character it places gets an Animation component that uses that graph. See Assets → The mesh source wizard.
  • New → Animation Graph creates a new one. Assign it to the Animation Graph field of an Animation component. Animation components come from the mesh source wizard; Add Component does not offer them.

In the graph editor, the Parameters tab of an animation graph has an Animation bindings section. Animation rig sets the skeleton the graph and its preview use, and each clip input has a slot for an animation clip. The preview shows Play (or Pause), Step and Reset buttons and the current time.

Audio graphs

An audio graph produces sound. It plays through a Sound Config:

  1. Create an audio graph with New → Procedural Graph → Audio.
  2. Create a Sound Config with New → Audio → Sound Config, and open it.
  3. Set its Source to the audio graph. The field accepts audio files and audio graphs. The Sound Config's Preview button plays it, and Stop stops it.

In the graph editor, the preview of an audio graph is a waveform display with Play (or Pause), Restart and Loop, and a trace for the Left and Right channels.

Procedural graphs in the Content Vault

The Content Vault has a Procedural Graphs category. Packs in it install into the open project like other asset packs, and their graphs then appear in the Content Browser, in the pack's folder under Assets/ContentVault.

Changing parameters from scripts

The Procedural Mesh component is PodComponent in C#. SetParameter and ResetParameter change an entity's exposed parameters from a script, with the same per-instance effect as editing them in the Inspector. While the scene plays, only procedural meshes without collision or generated bodies accept changes. On an articulated graph, SetBodyMaterialEmission can also make a material of a generated body glow while the scene plays. See Changing Procedural Graph Parameters from Scripts.

Upgrading from 2026.2

In 2026.2, robot motion graphs, animation graphs and sound graphs were separate file types with their own editors. In 2026.3 they are all procedural graphs, and the old formats are no longer supported:

  • .hmograph (motion graph), .hanimgraph (animation graph) and .sound_graph (sound graph) files are not recognised as assets, and no longer show in the Content Browser.
  • A Content Vault pack or an imported project that contains one of these files is rejected on install. The message starts with Unsupported legacy graph: followed by the file name.
  • A scene saved in 2026.2 in which a Robot Controller used a motion graph, or an Animation component used an animation graph, does not load, and neither does a prefab that contains one. Before you upgrade, open the scene in 2026.2, clear the Motion Graph or Animation Graph field and save.
  • This release has no automatic conversion. Rebuild the graph as a procedural graph, or install a current version of the pack from the Content Vault.

Where to go next