Skip to content

Hierarchy ​

The Hierarchy is the scene tree - every GameObject in the current scene, nested by parent-child relationship. It is where you select, rename, reparent, filter, and organise objects.

The tree is virtualized: only the rows near the scroll position are actually mounted, so a scene with 13,000+ objects (a large imported world) stays responsive.

The tree ​

Each row is one GameObject, indented by its depth, with a twisty (▶/▼) to fold or unfold its children. An icon shows the object's kind at a glance:

A character's skeleton expanded into bone rows: the tree indents each child under its parent, with disclosure arrows to fold a branch.

IconKind
◱Screen (has a UIScreen)
▭UI element (has a UINode)
🎥Camera
💡Light
◼Mesh (has a MeshRenderer)
📁Folder: a Transform and nothing else, holding children or at identity (see Folders)
○Empty, or an object whose components have no icon of their own

Layout labels. Screens that share a name are layout variants of one screen, so without help they read as identical rows (three ◱ Home in a row). Each one shows its window-size range after its name, in a small muted label: < 0.62, 0.62–1 or ≥ 1 for aspect (width / height), and h ≥ 700, h < 560 or h 560–700 for view height when that is set. Hover the label for the sentence it stands for, for example "Layout used when width/height is 0.62 to 1". A minimum counts as inside the range and a maximum does not, the way the variant picker settles two variants that meet at one limit. A screen alone under its name has no label. The Screens tab list shows the same labels.

Disabled objects are dimmed. When a new scene or imported pack populates the world, the tree folds to just the top level so you are not dropped into thousands of expanded rows; selecting an object elsewhere (for example clicking it in the Viewport) expands its ancestors and scrolls its row into view.

A generator's output is folded away too. Objects a script builds at runtime arrive after the scene has loaded, so the initial fold never saw them: a world script streaming in fifty chunks would otherwise bury the handful of objects someone actually authored. Such a parent folds the first time its generated children appear, and only once - open it and it stays open. The children stay selectable, because being able to click a chunk and look at what was built is the point of showing them at all.

The Hierarchy panel with a nested scene: a camera, a light, and a parent object with several mesh children expanded, one row selected, and the filter bar at the top.

Selecting ​

ActionResult
ClickSelect this row (and make it the range anchor)
Shift + clickSelect the range from the anchor to this row
Cmd / Ctrl + clickToggle this row in/out of the selection
↑ / ↓Move the selection up/down one visible row
Shift + ↑ / ↓Extend the selection from the anchor
HDisable / enable the selected object(s)
Double-clickFrame the object in the viewport

Selection is shared with the Viewport and Inspector - whatever you pick here shows its components in the Inspector, and vice-versa. Double-click a row to frame that object in the Editor view.

Filtering ​

Two filters at the top of the panel narrow the tree.

A name search shows only rows whose name matches, plus the ancestors leading to each match and the match's whole subtree. Matches are force-expanded so they are visible. Esc clears it.

Beside it is a filter popover built from what the scene actually contains, rather than from a fixed list of types. It reads the component registry, so a component added later - by the engine, an importer, or a plugin - becomes filterable with no special-casing: it appears in the popover as soon as some entity in the scene has one.

Each entry is a tick box, and a component that declares a field worth drilling into also lists its values, with a count each:

  • Light ticks every light; under it, directional, point and spot tick only that kind.
  • ParticleEmitter drills into which effect an emitter plays.
  • Script drills into which scripts an object carries, and an object with two scripts is findable under both.

Only fields whose value names something are drilled into (asset references, enums, and strings). A number or a vector identifies nothing - nobody goes looking for "the lights with intensity 1.4" - so those components stay a plain has-it or hasn't-it tick.

An entity whose drill-in field is empty lands in a none bucket rather than vanishing. An emitter with no effect assigned still has to be findable, and "why is nothing coming out of this thing" is exactly when you go looking for it.

While filtering, the count beside the filters shows the number of matches; otherwise it shows the number of top-level objects.

Reparenting and reordering ​

Drag any row to move it. As you hover another row, the drop lands in one of three zones based on where in the row you are:

  • Before / After reorder the object among its siblings.
  • Into reparents the object as the last child of the row you drop on.
  • Dropping onto the empty area (or the tree's root zone) moves the object to the top level, last.

You cannot drop an object onto itself or one of its own descendants (that would create a cycle) - those drops are ignored. Reparenting works during Play too; like all play-time edits, the change is cached and kept-or-discarded when you Stop.

The order is the scene's order ​

The Hierarchy keeps no order of its own. It lists siblings in the world order (World.entityOrder()): one sequence of every object in the scene, which is also the order the scene file lists them in and the order UI draws in. A reorder is an edit to the scene like any other: it is one undo step, it is saved with the scene, and it changes what draws on top at once, the same as after a save and reload.

  • A drag moves the object with everything under it, as one block. Dropped after a sibling, it goes after that sibling's whole subtree.
  • New objects (created, duplicated, pasted, instanced) join at the end of their parent's subtree, so they are its last child. A duplicate or paste lands at the top level, last.
  • Undoing a delete puts the objects back where they were in the order, not at the end.
  • A project saved before this keeps its order: the file's order is the world order it loads with, so its rows, its UI stacking and api.find answer as they did. Saving it again without changes writes the same entity list.

Which rows draw on top. For UI, a row lower in the Hierarchy draws over the rows above it: of two sibling elements, the lower one is on top, and an element that follows its parent draws inside it and over it. A UINode.z other than 0 comes first: a higher z sits on top whatever the order. The same order decides which of two objects with one name api.find returns: the higher row.

In a project made before this, a parent's children can sit far apart in the file, so a lower row can still draw under a higher one that belongs to another parent. Dragging a row, or grouping rows into a folder, gathers its subtree into one block.

You can also drag a prefab or mesh from the Asset Browser into the Hierarchy - it is instantiated at the camera focus (where you are looking). Scripts and materials are not tree drops; drop those onto the Inspector.

Folders ​

A folder is an object with a Transform at identity (position 0, no rotation, scale 1) and no other component. It groups what is under it and moves nothing: a child's world transform under an identity parent is its own local transform. Nothing in the scene format or the runtime is special about it; any Transform-only object with children shows the 📁 icon.

  • Create ▸ Folder (the + menu or right-click on empty space) makes an object named Folder at identity under the selected object's parent, right after the selection, and selects it. Create Child ▸ Folder makes one inside the row.
  • Group into Folder (⌘G, or the row menu) wraps the selected objects in a new folder under their common parent, as one undo step. Each keeps its world transform; one already under that parent keeps its local transform exactly. The folder takes the place of the first selected row, and the rows keep their order inside it. A selected object under another selected object goes with its parent.

Disabling a folder disables the objects under it for rendering and physics, but it does not hide UI under it: hide a screen with UIScreen.visible instead.

Right-click menu ​

Right-click a row for its context menu (batch actions apply to the whole selection when several rows are selected, shown as a (N) suffix):

ItemShortcutNotes
Create Child ▸-The full create palette - Folder, primitives, Empty, lights, Camera, a 2D ▸ submenu (Sprite, 2D Camera), and a UI ▸ submenu (Text, Panel, Button, Image) - added as a child of this row
RenameF2Single object only
Duplicate⌘D
FocusFFrame in the viewport
DisableH
Enable-
Isolate-Disable everything except the selection
Group into Folder⌘GSee Folders
Save as Prefab-Single object only - see Prefabs
Delete⌫

Right-click empty space for the area menu: Create ▸ (the same palette), Paste (⌘V), and Show All (re-enable every disabled object - the counterpart to Isolate).

See also ​

Awaken: browser-native WebGPU game engine.