main
The default startup scene seeded into every new world. It is the asset `.world_settings`'s `startup_scene = "scenes.main"` points at, and the scene the world entrypoint loads on bind. Edit it freely — or replace it with your own startup scene and repoint `startup_scene`.
Main Scene
The default startup scene seeded into every new world. It is the asset
.world_settings's startup_scene = "scenes.main" points at, and the
scene the world entrypoint loads on bind. Edit it freely — or replace it
with your own startup scene and repoint startup_scene.
What it ships
scene.json (v6) materializes a minimal, immediately-renderable stage:
- ground — a 50×50 lit-checkerboard cube with a matching box collider.
- sun — a directional
@builtin::components.Light. - ambient — a low ambient
@builtin::components.Lightfill. - sky — a
@builtin::components.ProceduralSky(time-of-day 14:00).
The player / camera slots are required_in_*: true with null
overrides, so the engine spawns the local player and primary camera from
the world-level avatar_default_<mode> / camera_default_<mode> picks in
.world_entrypoint.luau. You don't spawn either yourself.
Mental model — read man getting-started
This scene runs inside the unified world / scene / players / camera
flow. To customize:
- Defaults — set world slots in
.world_entrypoint.luau, or per-scene overrides inscene.json(player.avatar_<mode>/camera.behavior_<mode>). - Spawn position — in
entrypoint.luau'slocalPlayerReady(player)callback:player.entity.position = { x, y, z }. Spawn position is NOT stored inscene.json. - Camera follow —
layers.active.camera.follow = entity_proxy.
Adding entities
Static entities at load time go in scene.json::entities. Dynamic spawns
go in entrypoint.luau::onLoad() via entity.spawn(...) /
sc.spawnModel(...). Entities spawned from onLoad participate in
layers.active:save() unless marked temporary = true.
Conventions
- Y is up; +Z is forward.
- Lighting lives in
scene.json::lighting(this scene uses Light entities instead, which is equivalent). - Edit mode is state-frozen —
update/fixedUpdate/ physics are skipped. UseeditorUpdate(dt)for anything that must tick in edit mode.
Scoped to this part · feeds back into the world's score.