Skip to content
Curious Trove
Guide Placement OctoShaper 1.2Updated

Assemblies and Placement

Most props are easiest to build as if they sat alone at the origin. OctoShaper then stamps the finished result onto every placement it receives, whether that's the executor's transform, points from a parent graph, or a scatter of thousands.

The idea

ExplainerAuthor once at the origin, place anywhere

Each placement row carries a position, rotation and scale. Placing an assembly makes one copy of your origin-authored result per row, moved, rotated and scaled by that row.

Where placements come from

  • The executor. Enable Pass Transform data on the Procedural Graph Executor and its transform arrives as a row in Main Input.
  • A parent graph. Connect a scatter of points to a subgraph's input, and each point becomes a placement.
  • Anything else. Any ElementSet with transforms works, for example points on a spline or a surface.

Option 1: the Local assembly toggle

Turn on Local assembly in the graph settings. While you author, incoming transforms become identity, so you can build around the origin. At output, every result is attached to the original input transforms.

This is the easiest option for a graph that is a prop.

Option 2: Place Local Assembly

Leave the toggle off and add Place Local Assembly:

  1. Connect Main Input, or any set of transforms, to Placements.
  2. Connect the finished, origin-authored prop to Local Elements.
  3. Use the node's output as your result.

Several of the bundled samples are built this way. It lets you keep some branches in world space and others local.

Warning: Don't combine the Local assembly toggle with Place Local Assembly. The placement would be applied twice.

Place Local Assembly node with its Placements and Local Elements inputs connected, next to a grove of placed trees in the Preview Stage
Place Local Assembly stamps one prop onto every placement.

Subgraphs and shared prototypes

Connect subgraph inputs explicitly. When a subgraph builds a shared prototype, such as one barrel reused many times, give it a single origin element so it builds exactly one copy. Then place that copy where you need it.

Building GameObject hierarchies

Prefab and primitive rows can form real Unity hierarchies:

  • Create Assembly Roots creates one invisible root per placement.
  • Assign Parents appends parent elements and attaches top-level children by sourceRowIndex, one-to-one, or to a single parent.

Rows with a parentRowIndex store parent-local transforms. Root rows use graph or world coordinates. GPU-instanced rows can't take part in hierarchies. See Rendering and instancing modes.

The older Create Parent Element and Assign Parent Element nodes are legacy. They still work in saved graphs but are hidden from node search.

Handles and handle space

With an executor selected, or its Preview Stage open, the OctoShaper Tools overlay in the Scene view offers OctoShaper Position for Vector3 parameters and OctoShaper Spline for spline parameters. See Context manipulation.

OctoShaper Handle Space decides how those handles map to your graph:

Mode Use it when
Auto Default. Handles Local assembly and direct spline distribution for you.
World The value is a world-space position.
Input position The value is an offset from the input position, ignoring its rotation.
Input transform The value lives in the placement's full local space, for example a template placed with Place Local Assembly.

Changing handle space never changes stored values, and every drag supports Undo.

Frequently asked questions

Should I use the Local assembly toggle or Place Local Assembly?
Use one, never both. The toggle is the simplest: the whole graph is authored locally and placed at output. Place Local Assembly gives you explicit control inside the graph. Combining them applies the placement twice.
Why does my graph produce nothing when placed?
Place Local Assembly outputs one copy per placement row. With an empty Placements input, nothing is produced. Check that Main Input is connected and, on the executor, that Pass Transform data is enabled if you rely on it.
Can GPU-instanced rows have parents?
No. Instanced rows aren't GameObjects, so they can't be parents or children in Unity's hierarchy. Keep hierarchies on the GameObject path.