Dicey Table

The Scene Model

DiceyTable describes every noun in a scene along three orthogonal axes. Not one list — three. Every noun gets a coordinate on each of them.

Axis Question it answers Values
Provenance Who defined it? Engine · Platform · Project
Lifecycle What stage is it at? Definition · Scene Entity · Live Entity
Composition What kind of thing is it? Entity · Component · System · Folder · Tag Group

The first two axes are covered on Provenance and lifecycle. This page is the third one, and it is the axis people get wrong, because PlayCanvas already owns the word Component and it is tempting to reuse it for the things you put on a table.

Do not. In DiceyTable, a thing you put on the table is an Entity.

The five composition nouns#

Term Rule
Entity A container with a transform and no behavior of its own. Every Hierarchy row with a transform is an Entity.
Component Data and behavior attached to one Entity. Only ever render, rigidbody, collision, light, camera, script, sound, element or screen. Never used for anything else, in code, in the UI, or in these docs.
System Owns every instance of one component type and processes them in batches. Engine-internal; never exposed in the editor.
Folder A Hierarchy grouping row that is not an Entity and has no transform — Room, Walls, Lights, Table, Player Zones, Entities.
Tag Group A set of Entities defined by a shared tag, such as seat-group. Not a parent; membership is by tag.

Entity#

An Entity is a container. It has a transform — position, rotation, scale — and by itself it does nothing. Behavior comes from the Components attached to it, and in DiceyTable's case most of the behavior actually lives in the runtime rather than on the entity at all.

A card, a die, a token, a board, a bag, a wall, a seat zone, a light: each of those is an Entity. In the Hierarchy they appear under the Entities (N) folder, whose count is every entity in the scene, not just the un-parented ones — the folder answers "how many entities are in this scene?", and nesting must not change that answer.

Entities can be parented to each other. Parenting is a transform and organization relationship: a parent's position and rotation propagate to its children for free, and a parent's scale multiplies every descendant's world scale. Chains are capped at a depth of 8, following PlayCanvas's own advice to keep hierarchies shallow.

Component#

A Component adds data and behavior to exactly one Entity. The word is reserved for the engine's component types and nothing else.

Two consequences follow, and both matter when you are reading the Inspector:

  • The Hierarchy folder holding your table entities is Entities (N). It was once called Components (N), which was plainly wrong — it contains Entities.
  • Inspector sections that are not engine components (PIECE, DIE SETTINGS, SOUND SETS (BUILT-IN), SOUND OVERRIDES) are Platform panels, and the Inspector gives them a different header accent so you can tell at a glance which is which.

System#

A System owns all instances of one component type — app.systems.rigidbody owns every rigidbody — and processes them in batches. That batching is why an ECS is fast. You never touch a System from the editor, a scene script or a mod; it is listed here only so the word has a definition when you meet it in PlayCanvas's own documentation.

Folder#

A Folder is a Hierarchy row with no transform and no entity behind it. Room, Walls, Lights, Table, Player Zones and Entities are Folders. You cannot move a Folder, parent something to it, or address it from a script — it is a section header for the authoring tree.

The Hierarchy's TYPE column shows folder for these rows rather than their internal kind, because the internal kind would be a lie about what the row is.

Tag Group#

A Tag Group is a set of Entities that share a tag. The seat-group rows in the Hierarchy are the built-in example: the entities in a seat group are not children of anything, they just carry the same tag. The TYPE column shows tag group.

The distinction from a Folder is that a Tag Group has members, and membership is computed. The distinction from parenting is that a Tag Group is not a parent — moving a "group" does not move its members, because there is nothing to move.

The Hierarchy's node kinds#

The Hierarchy panel is an authoring view. Each row's TYPE token tells you which composition noun it is:

Row TYPE token What it genuinely is
Room folder Folder (scene section)
Floor / Ceiling entity Entity with render + collision
Walls folder Folder
North Wall wall Scene Entity
A poster poster Scene Entity
Lights (3) folder Folder
Key Light light Scene Entity with a light component
Table folder Folder
Player Zones (N) folder Folder
seat-group-0 tag group Tag Group (#seat-group)
Zone 1 seat-zone Scene Entity
Name Label seat-label Scene Entity
Entities (N) folder Folder
chess-board entity Scene Entity

The column keeps the specific type where the specific type is honest, and falls back to folder / tag group / entity where it would not be.

Two tiers of Component: intrinsic and optional#

DiceyTable splits engine components into two tiers. This is a decision, not an inconsistency, and it is worth understanding because it is the first thing that looks odd in the Inspector: RENDER, RIGIDBODY and COLLISION are always present and cannot be removed, while LIGHT and CAMERA appear only if you add them.

Intrinsic components — render, collision, rigidbody#

Every Scene Entity has all three. Their authored state lives where it always has — in physics and in metadata.materialId on the entity — rather than in a component list. They are configured and disabled, never removed, which follows the engine's own guidance that disabling a component is cheaper than removing and recreating it.

RIGIDBODY and COLLISION each have a real enable flag (physics.rigidbodyEnabled and physics.collisionEnabled; absent means enabled). Disabling rigidbody takes the body out of the simulation without discarding its authored mass, friction and shape. Disabling collision makes the entity pass-through while staying visible and grabbable.

RENDER has no enable checkbox. Visibility is owned end-to-end by one writer — the system that also encodes card-face and hidden-information rules — and a second writer would fight it. The entity's own Enabled toggle in the ENTITY header is the control.

Optional components — light and camera#

These are listed in the entity's components[] array: a discriminated union, capped at 8 entries, at most one per type, addable and removable. Today the addable set is exactly:

light · camera

script is not in that list. A scene script is attached through metadata.scriptId and its own SCRIPT Inspector section — there is one attachment story, not a modern one and a legacy one.

Why not one unified list?#

Unifying would mean migrating ObjectPhysics and metadata.materialId into components[] — a breaking change to the most-touched shape in the codebase, in exchange for cosmetic tidiness. The two-tier split is honest, it matches how the entity model already works, and it matches what the Inspector already shows you.

Which component types are exposed, and why#

A type becomes addable only when four gates pass:

Gate Requirement
G1 An authored shape exists in the shared schema.
G2 The runtime re-applies it on every document rebuild.
G3 It survives equality comparison → delta → host migration → save and load.
G4 Adding it cannot destabilise physics or change authority.
Component Verdict
render, collision, rigidbody Intrinsic — configure and disable, never remove
script Exposed, via metadata.scriptId and the SCRIPT section
light Exposed — addable and removable
camera Exposed, with guardrails: added disabled, priority pinned strictly below the table camera, and at most one enabled entity camera at a time
sound Not exposed — superseded by the spatial-sound system; use SOUND OVERRIDES
element / screen Not exposed — world-space UI is owned by the table's UI state
anim, particlesystem Not exposed — no runtime support

Unsupported types are shown grayed out in the + ADD COMPONENT popover with a one-line reason rather than hidden, so "why can't I add a particle system?" answers itself.

Say this, not that#

This table is normative. New UI strings, identifiers and documentation prose follow it.

Say Not Why
Entity / Scene Entity Component, Piece, Object (as a type label) "Component" is taken by the engine
Entities (N) folder Components (N) It contains Entities
Engine Component Component, unqualified, where ambiguity is possible Disambiguates from Platform panels
Platform panel Component, for DIE SETTINGS, SOUND OVERRIDES, PIECE Those are not engine components
Live Entity / guid "the entity", when you mean the pc.Entity Distinguishes it from the authored row
Scene Entity / id "the entity", when you mean the document row id is the only stable key
Folder Group, when the row has no transform A Folder is not an Entity
Tag Group Group, when membership is by tag A Tag Group is not a parent
Definition / Template / Preset "the object", in the asset explorer It is not in the scene
Parenting Grouping, welding, joining Parenting is transform and organization
Joint Parenting, welding A Joint is a physics constraint between two dynamic bodies
Weld (compound) Parenting, joint A Weld is one physics body for a rigid sub-assembly

Words that are retired#

  • "Component" as a synonym for a thing on the table. It is an engine component or it is nothing.
  • "Piece" and "Object" as formal terms. Both are fine in ordinary prose and marketing copy. Neither is a type label in the UI, an identifier in new code, or a term in these docs.

Parenting, welding and joints are three different things#

They are easy to confuse because all three make several entities behave as one. The one-line rule:

Parenting gives a child a parent transform, and makes it kinematic. Weld merges children into the parent's single compound rigidbody. Joints connect two independently-dynamic bodies with a physics constraint.

Each has its own page later in this guide. What matters here is that they are distinct nouns and the docs never use one to mean another.