~3 min read

The Godot Editor, scenes, and nodes

The scene tree and Node3D — the foundation of everything in Godot.

Editor: the main windows

The Godot Editor is an IDE for content. The main docks (draggable, as in Unity):

  • 3D Viewport — the scene window where you fly around and place nodes. Switchers: 2D / 3D / Script / AssetLib.
  • Scene (top left) — the node tree of the current scene. An analog of the Unity Hierarchy.
  • FileSystem (bottom left) — the project’s files. An analog of the Unity Project panel.
  • Inspector (right) — the properties of the selected node or resource.
  • Node (top right) — a tab for viewing/connecting the signals of this node. This is a separate thing relative to Unity.
  • Output / Debugger / Search — at the bottom.
Q-W-E-R as in 3D software

The gizmo bindings in the 3D viewport match most 3D software: Q — select, W — move, E — rotate, R — scale. Snap to grid — the Y key (it toggles).

What changed in the editor since 4.6

If you open 4.6 for the first time after older versions, you’ll notice two big changes:

  • Modern theme — a new editor theme (a more neutral palette, less blue). In Editor Settings you can revert to the classic one.
  • Unified docking — docks can now be dragged to any side of the screen, including bottom panels. You can build any layout. Previously, docks were tied to fixed positions.

A scene is a .tscn file

A scene in Godot is a text file .tscn describing a tree of nodes. It opens in any editor and is git-friendly. An example of a minimal scene:

[gd_scene load_steps=2 format=3 uid="uid://abc123"]

[ext_resource type="Script" path="res://player.gd" id="1"]

[node name="Player" type="CharacterBody3D"]
script = ExtResource("1")

[node name="Mesh" type="MeshInstance3D" parent="."]

[node name="Collision" type="CollisionShape3D" parent="."]

Scenes can be instantiated into other scenes, inherited, and have individual properties overridden — this is an analog of Unity Prefab Variants, but more flexible.

Web

A React page <App /> renders <Header />, <Main />, <Footer />. Each of these is a component in its own file; they can be reused.

Unity

The scene Level_01.tscn includes Player.tscn, HUD.tscn, Enemy.tscn. Each of these is a separate file that can be edited independently. Edit one script — all instances update.

The Node — the main primitive

There is no GameObject in Godot. There is the Node — the base class that every node in the scene belongs to. And its specialized subclasses:

Object                                ← the base for the entire engine
├── RefCounted
│   └── Resource                      ← data assets (.tres), refcounted
└── Node                              ← everything in the scene tree
    ├── CanvasItem                    ← the common ancestor of 2D objects and UI
    │   ├── Node2D                    ← 2D transform (position, rotation, scale)
    │   └── Control                   ← UI (anchors, offsets, layout)
    ├── Node3D                        ← 3D transform
    └── ... dozens of specializations

Key 3D subclasses of Node3D:

  • MeshInstance3D — draws a mesh.
  • Camera3D — a camera.
  • DirectionalLight3D, OmniLight3D, SpotLight3D — lights.
  • StaticBody3D, RigidBody3D, CharacterBody3D, AnimatableBody3D, Area3D — physics.
  • CollisionShape3D — a shape for collisions.
  • AudioStreamPlayer3D — sound.
One script per node

Unlike Unity, you can attach only one script to a node. This is not a limitation but a philosophy: composition is done through child nodes, not through a “stack of components”. Need an object with health, an inventory, and shooting? One Player.gd script + child nodes Inventory, Weapon, Health, each with its own script.

Hierarchy and transform

A Node3D node has transform: Transform3D — a structure made of basis (a 3×3 rotation+scale matrix) and origin: Vector3 (the position). Convenient shortcuts:

  • position: Vector3transform.origin.
  • rotation: Vector3 — Euler angles (in radians!).
  • rotation_degrees: Vector3 — the same in degrees, for editor convenience.
  • scale: Vector3.
  • global_position, global_transform — in world coordinates.
$Mesh.position = Vector3(0, 1.5, 0)        # up by 1.5 m
$Mesh.rotation_degrees.y += 90.0           # rotate 90° around Y
$Mesh.scale = Vector3.ONE * 2.0            # scale up 2x

$Name is a shortcut for get_node("Name") — looking up a child by name. $Path/To/Child is a relative path, like in a file system.

Coordinate system

In Godot it is right-handed Y-up:

  • +X — to the right
  • +Y — up
  • +Ztoward the observer (toward us) — and −Z points forward, away from the observer
The main difference from Unity

Unity is left-handed, +Z forward. Godot is right-handed, −Z forward. That is, by default the camera looks “into minus Z”. transform.basis * Vector3.FORWARD in Godot returns the “forward” direction (where internally Vector3.FORWARD = Vector3(0, 0, -1)).

Default gravity: Vector3(0, -9.8, 0). One Unit = 1 meter (by convention).

Groups

Godot does not use Unity tags. Instead — groups:

# Add a node to a group (in the editor or from code)
enemy.add_to_group("enemies")

# Get all nodes in a group
var all_enemies = get_tree().get_nodes_in_group("enemies")

# Call a method on all of them
get_tree().call_group("enemies", "take_damage", 10)

Groups can be configured in the editor in the Node → Groups tab. Suitable for queries like “find all NPCs”, “all checkpoints”, “enemies in the active zone”.

Running a scene

The buttons at the top right of the editor:

  • Play (F5) — run the project’s main scene.
  • Play Scene (F6) — run the currently open scene.
  • Play Custom Scene (Ctrl+Shift+F5) — pick any.

The main scene is set in Project → Project Settings → Application → Run → Main Scene.

The next chapter covers GDScript and the node lifecycle.