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.
- In the Scene Hierarchy, right-click and choose Create → 3D.
- Below the separator, pick Procedural Cube, Procedural Sphere, Procedural Plane, Procedural Cylinder, Procedural Cone, Procedural Torus, Procedural IcoSphere, Procedural Capsule or Procedural Lucky Logo.
- 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:
- Select the primitive and click Promote to Graph in its Procedural Mesh component.
- The editor saves the shape as
<Entity Name> Graph.hpodgraphin the project'sAssetsfolder, 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:
- Create an audio graph with New → Procedural Graph → Audio.
- Create a Sound Config with New → Audio → Sound Config, and open it.
- 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¶
- Robots covers robot packs, the Robot Controller and its motion graph.
- Changing Procedural Graph Parameters from Scripts drives graph parameters and body emission from C#.
- Assets covers the Content Browser, where graphs are created and stored.
- Content Vault has ready-made procedural graph packs.