đČ Godot 4 â Moteur de Jeu Open Source (GDScript, C#)
Guide complet IDEO-Lab sur le moteur de jeu 2D/3D libre et open-source.
Concept : Moteur Libre
Open Source (MIT), 2D/3D, léger, "Nodes".
Godot Open Source MIT LicenseInstallation & Versions
Standard (GDScript) vs. .NET (C#). Pas d'installateur.
GDScript C# / .NETvs. Unity / Unreal
Philosophie (Nodes vs Components), Poids, Langage.
Unity Unreal ComparatifConcept : Scene & Node
ScĂšne (Arbre de NĆuds), NĆud (Brique de base).
Scene Node ArborescenceTypes de NĆuds (Nodes)
Node2D, Node3D (Spatial), Control (UI).
Node2D Node3D ControlInstanciation de ScĂšnes
Composition (ScĂšnes dans ScĂšnes). (Ăquiv. Prefab).
Instancing PrefabGDScript : Vue d'ensemble
Langage (Python-like), Typage (Dynamique/Statique).
GDScript Python-like Typage StatiqueGDScript : Cycle de Vie
_ready(), _process() (Frame), _physics_process().
GDScript : NĆuds & Signaux
AccĂšs ($NodeName), export, Signaux (connect).
C# (dotnet) : Vue d'ensemble
Version Godot Mono, .NET 6/7. Godot.Node.
C# : Cycle de Vie
_Ready(), _Process(), _PhysicsProcess().
C# : NĆuds & Signaux
GetNode, [Export], [Signal], Connect().
Physique 2D
CharacterBody2D, StaticBody2D, Area2D (Trigger).
Physique 3D
CharacterBody3D, RigidBody3D, Area3D.
Input Map
Input.is_action_pressed(), _input().
Rendu (Godot 4)
Vulkan (Forward+ / Mobile) & Compatibility (GLES3).
Vulkan GLES3UI (NĆuds Control)
Button, Label, Panel. ThĂšmes.
Export (Build)
Export Templates (PC, Mac, Linux, Web, Android, iOS).
Export TemplatesQu'est-ce que Godot ?
Godot Engine est un moteur de jeu (Game Engine) 2D et 3D multiplateforme, entiÚrement libre (free) et open-source (FOSS), publié sous la Licence MIT.
Avantages de la Licence MIT :
- Aucun Coût : 100% gratuit. Pas de frais, pas de royalties, pas de frais "par installation".
- Code Ouvert : Vous pouvez lire (et modifier) l'intégralité du code source (C++) du moteur.
Caractéristiques
- Léger : L'éditeur (binaire unique) est incroyablement petit (~50-100 Mo) et ne nécessite pas d'installation.
- Multi-Langage : Supporte GDScript (langage dédié, Python-like) et C# (via .NET).
- Multiplateforme : Exporte vers Windows, Mac, Linux, Android, iOS, et Web (HTML5).
- Focus 2D : Godot est réputé pour avoir l'un des meilleurs (si ce n'est le meilleur) workflows 2D du marché.
Philosophie : "Scene-based Node tree"
La philosophie de Godot est différente de celle d'Unity (Entity-Component).
Dans Godot, tout est un NĆud (Node). Un NĆud est une "brique" (ex: "Sprite2D", "Camera3D", "AudioStreamPlayer").
Une ScĂšne (Scene) est un arbre (Tree) de NĆuds.
(ScĂšne: "Player")
â Node (Type: CharacterBody2D) (Le "Joueur")
ââ Node (Type: Sprite2D) (Le "Visuel")
ââ Node (Type: CollisionShape2D) (La "Hitbox")La force de Godot est que les ScĂšnes elles-mĂȘmes peuvent ĂȘtre des NĆuds dans d'autres ScĂšnes (Instanciation).
(ScĂšne: "Level_1")
ââ Node (Type: Node2D) (Le "Monde")
â ââ Node (Instance: "Player.tscn")
â ââ Node (Instance: "Player.tscn") (Player 2)
â ââ Node (Instance: "Enemy.tscn")
ââ Node (Type: CanvasLayer) (L'"UI")
ââ Node (Type: Label) (Score)Godot est portable. Il n'y a pas d'installateur (contrairement Ă Unity Hub). Vous tĂ©lĂ©chargez un binaire unique (un .exe ou binaire Linux) et vous l'exĂ©cutez.
Le "Project Manager" (gestionnaire de projets) est intégré au binaire de l'éditeur.
Les Deux Versions (Godot 4)
Sur la page de téléchargement (godotengine.org), vous devez choisir entre deux versions :
1. Version Standard
Langage : GDScript.
C'est la version recommandée (90% des tutoriels, la plus légÚre).
2. Version .NET
Langages : GDScript ET C#.
Nécessite l'installation du SDK .NET (6+) séparément.
Utilisé si vous préférez C# (ex: migration depuis Unity) ou si vous avez besoin de performance C#.
| CritĂšre | Godot | Unity |
|---|---|---|
| Philosophie (CĆur) | Arbre de NĆuds (Nodes) (HĂ©ritage). | EntitĂ©-Composant (ECS) (Composition). |
| Philosophie (ScÚne) | ScÚnes imbriquées (Instancing). (TrÚs flexible). | Prefabs. (Plus rigide). |
| Langage Principal | GDScript (Python-like, intégré). | C# (Support C# supérieur). |
| Licence | Open Source (MIT). 100% gratuit, 0 royalty. | Propriétaire (Payant "per-seat" ou "per-install" selon revenu). |
| Taille (Ăditeur) | ExtrĂȘmement LĂ©ger (~100 Mo portable). | Lourd (Multiples Go, installation via Hub). |
| Focus 2D | Excellent (Considéré comme supérieur, pixels natifs). | Bon (mais souvent considéré comme un moteur 3D "adapté"). |
| Focus 3D | Bon (Godot 4/Vulkan). (Rattrape son retard). | Excellent (Maturité, HDRP, écosystÚme). |
| ĂcosystĂšme | Bon (Asset Library). | Immense (Asset Store). |
Philosophie (Tout est un NĆud)
Dans Godot, la philosophie est basĂ©e sur l'HĂ©ritage et la Composition via un Arbre de NĆuds (Node Tree).
Node (NĆud)
Un NĆud (Node) est la "brique" de base (la plus petite unitĂ©) du moteur. C'est une Classe qui hĂ©rite de Node (ou Node2D, Node3D...).
Chaque NĆud fournit une fonctionnalitĂ© spĂ©cifique :
Node2D: (Base pour la 2D, a un Transform2D)Sprite2D: (Affiche une texture)CharacterBody2D: (GÚre la physique d'un joueur 2D)Camera2D: (Caméra 2D)Timer: (Déclenche un signal aprÚs X sec)
Scene (ScĂšne)
Une ScĂšne n'est pas un "Level". Une ScĂšne est un Arbre de NĆuds (un Node racine et ses enfants) sauvegardĂ© dans un fichier (.tscn ou .scn).
Une ScĂšne peut ĂȘtre :
- Un Niveau complet (ex:
Level_1.tscn) - Un Personnage (ex:
Player.tscn) - Une Balle (ex:
Bullet.tscn) - Une Interface (ex:
MainMenu.tscn)
L'arborescence des NĆuds est basĂ©e sur l'HĂ©ritage (C++). Choisir le bon nĆud de base est crucial.
Node (Le "pĂšre" de tout)
â (Logique pure, timers, requĂȘtes HTTP...)
ââ Node2D (Base pour la 2D)
â (A un Transform2D : position, rotation, scale)
â ââ Sprite2D (Visuel)
â ââ Camera2D
â ââ PhysicsBody2D (Base Physique 2D)
â â ââ CharacterBody2D (Joueur)
â â ââ StaticBody2D (Sol, Murs)
â â ââ RigidBody2D (Objets)
â ââ Area2D (Trigger / Zone)
â
ââ Node3D (Base pour la 3D)
â (A un Transform3D : position, rotation, scale)
â ââ MeshInstance3D (Visuel)
â ââ Camera3D
â ââ PhysicsBody3D (Base Physique 3D)
â â ââ CharacterBody3D (Joueur)
â â ââ StaticBody3D (Sol, Murs)
â â ââ RigidBody3D (Objets)
â ââ Area3D (Trigger / Zone)
â
ââ Control (Base pour l'UI)
(A un RectTransform : ancres, marges)
ââ Label (Texte)
ââ Button (Bouton)
ââ Panel (Fond)
ââ VBoxContainer (Layout)
C'est la Philosophie de Composition de Godot. (L'équivalent du "Prefab" d'Unity, mais en plus flexible).
Principe : N'importe quel fichier ScĂšne (.tscn) peut ĂȘtre utilisĂ© comme un NĆud (Node) Ă l'intĂ©rieur d'une autre ScĂšne.
Workflow
- ScĂšne 1 (
Player.tscn) :CharacterBody2D (Root) â Sprite2D â CollisionShape2D
- ScĂšne 2 (
Bullet.tscn) :Area2D (Root) â Sprite2D â CollisionShape2D
- ScĂšne 3 (
Level.tscn) :Node2D (Root) â (Instance de "Player.tscn") â TileMap (Le dĂ©cor)
Instanciation (Script)
Pour faire "spawner" une balle (ScĂšne "Bullet") depuis le Joueur (ScĂšne "Player").
(Dans Player.gd)
extends CharacterBody2D
# 1. Pré-charger la ScÚne (Asset)
var bullet_scene = preload("res://Bullet.tscn")
func _physics_process(delta):
if Input.is_action_just_pressed("ui_accept"):
# 2. Instancier la scĂšne
var bullet_instance = bullet_scene.instantiate()
# 3. Ajouter l'instance Ă l'arbre de la scĂšne
# (Sinon elle n'existe pas dans le jeu)
get_tree().root.add_child(bullet_instance)
# 4. Configurer (ex: position)
bullet_instance.global_position = self.global_position
GDScript est le langage de scripting principal de Godot. C'est un langage haut niveau, orientĂ© objet, conçu pour ĂȘtre simple et profondĂ©ment intĂ©grĂ© au moteur.
Caractéristiques
- Syntaxe (Python-like) : Utilise l'indentation (pas d'accolades
{}ni de;). (TrÚs facile à apprendre). - Léger : Intégré directement, pas de "glue" (contrairement à C#).
- Typage Optionnel (Statique/Dynamique) :
- Dynamique (Legacy) :
var vitesse = 100 - Statique (Godot 3+/4, Recommandé) :
var vitesse: int = 100(Permet l'auto-complétion).
- Dynamique (Legacy) :
Exemple de Script (Player.gd)
# 1. HĂ©ritage (le NĆud auquel ce script est attachĂ©)
extends CharacterBody2D
# 2. Variables (Membres)
var speed: int = 300
var gravity: int = 800
# 3. (Optionnel) Référence "exportée" (visible dans l'Inspecteur)
@export var message: String = "Bonjour"
# 4. Cycle de vie (_ready = Start)
func _ready():
# 'position' est hérité de Node2D
print("Le Joueur est prĂȘt Ă : ", position)
# 5. Cycle de vie (_physics_process = FixedUpdate)
func _physics_process(delta):
# Appliquer la gravité
velocity.y += gravity * delta
# Gérer les inputs (voir 5.3)
var input_x = Input.get_axis("ui_left", "ui_right")
velocity.x = input_x * speed
# Appliquer le mouvement
move_and_slide()
Godot (comme Unity) appelle des fonctions "magiques" (callbacks) sur vos scripts (NĆuds) Ă des moments prĂ©cis.
| Fonction (GDScript) | Ăquivalent (Unity) | Description |
|---|---|---|
_ready() | Awake() / Start() | AppelĂ© 1 fois, lorsque le nĆud (et tous ses enfants) est entrĂ© dans l'arbre (ScĂšne). (Pour initialiser). |
_process(delta) | Update() | Appelé à chaque frame (Rendu). (delta = temps depuis la derniÚre frame). (Pour Logique de jeu, Input). |
_physics_process(delta) | FixedUpdate() | Appelé à intervalle fixe (60x/sec par défaut). (delta = 1/60). (Pour la Physique : move_and_slide). |
_input(event) | OnGUI() (partiel) | Appelé à chaque événement d'input (clic souris, touche...). |
_exit_tree() | OnDestroy() | AppelĂ© lorsque le nĆud est retirĂ© de la ScĂšne (ex: queue_free()). |
AccĂšs aux NĆuds ($)
Pour qu'un script (ex: Player.gd) parle Ă un autre nĆud (ex: Sprite2D), il doit y accĂ©der via l'arbre de la scĂšne.
Arbre de ScĂšne : Player (CharacterBody2D) (Script: Player.gd) â Sprite (Sprite2D) â Hitbox (CollisionShape2D)
(Dans Player.gd)
extends CharacterBody2D
# 1. Raccourci ($) - Si le nĆud est un enfant direct
# (Rapide, mais casse si on renomme "Sprite")
var sprite_node = $Sprite
# 2. GetNode (Robuste)
# (Utilisé pour les références 'export')
var collision_node = get_node("Hitbox")
# 3. @onready (Recommandé)
# (Assigne à _ready(), évite les erreurs "null")
@onready var sprite_node_ready = $Sprite
func _process(delta):
sprite_node_ready.flip_h = true@export (Variables d'Inspecteur)
(Ăquivalent public/[SerializeField] d'Unity). Expose une variable dans l'Inspecteur.
@export var speed: int = 400 @export var player_name: String @export var target_node: NodePath @onready var target = get_node(target_node)
Signaux (Signals) - Le SystĂšme d'ĂvĂ©nements
C'est le systĂšme d'Ă©vĂ©nements (dĂ©couplage) de Godot. Au lieu d'appeler directement une fonction (couplage fort), un NĆud "Ă©met un signal" (crie), et d'autres NĆuds "Ă©coutent" (s'y connectent).
Ex: Un Button (NĆud) a un signal pressed(). Un Area2D a un signal body_entered().
Workflow (Connexion)
1. (GUI) : (Le plus simple) Dans l'Inspecteur, onglet "Node", double-cliquer sur le signal (ex: pressed()) et le connecter Ă une fonction (ex: _on_button_pressed) dans votre script.
2. (Code) :
# (Dans le script _ready() du parent)
func _ready():
# 1. Définir un signal personnalisé
signal mon_signal_perso(valeur, texte)
# 2. Connecter le signal "pressed" du NĆud "MonBouton"
# Ă la fonction "_ma_fonction" de ce script (self).
$MonBouton.pressed.connect(_ma_fonction)
func _ma_fonction():
print("Le bouton a été pressé !")
# 3. Ămettre un signal
mon_signal_perso.emit(10, "hello")
Godot (via la version .NET) a un support officiel pour C# (sur .NET 6+). C'est une alternative à GDScript, souvent préférée par les développeurs venant d'Unity ou ceux préférant le typage statique robuste de C#.
Fonctionnement
- HĂ©ritage : (Similaire Ă GDScript) Votre script C# doit hĂ©riter d'un type de NĆud Godot (ex:
public partial class Player : CharacterBody2D). partial class: (Nouveau dans Godot 4) Godot utilise des "Source Generators" (GĂ©nĂ©rateurs de Source) pour la "magie" (binding C# <-> C++), nĂ©cessitant que les classes de NĆud soientpartial.- IDE : Le code est Ă©ditĂ© dans un IDE externe (VS Code, Visual Studio, Rider). Godot gĂšre la solution (
.sln) et la compilation.
Le cycle de vie C# est identique Ă GDScript, mais en syntaxe C# (PascalCase).
| Fonction (C#) | Fonction (GDScript) | Description |
|---|---|---|
public override void _Ready() | func _ready(): | Appelé 1 fois (Initialisation). |
public override void _Process(double delta) | func _process(delta): | Appelé à chaque frame (Logique). |
public override void _PhysicsProcess(double delta) | func _physics_process(delta): | Appelé à chaque frame physique (Physique). |
public override void _Input(InputEvent @event) | func _input(event): | Appelé à chaque événement d'input. |
La syntaxe C# utilise des Attributs ([]) lĂ oĂč GDScript utilise @.
using Godot;
public partial class Player : CharacterBody2D
{
// 1. Export (Variables d'Inspecteur)
[Export]
public int Speed { get; set; } = 400;
[Export]
private NodePath _spritePath;
private Sprite2D _sprite;
// 2. Cycle de vie (_Ready)
public override void _Ready()
{
// 3. AccĂšs aux NĆuds (GetNode) (Pas de '$')
_sprite = GetNode<Sprite2D>(_spritePath);
// 4. Connexion aux Signaux (code)
// (Connecte le signal "pressed" du NĆud "MyButton"
// à la méthode "OnMyButtonPressed" de cet objet)
GetNode("MyButton").Connect("pressed",
new Callable(this, nameof(OnMyButtonPressed)));
}
// 5. Définition d'un Signal (perso)
[Signal]
public delegate void HealthChangedEventHandler(int newHealth);
// 6. Ămission d'un Signal
private void TakeDamage(int amount)
{
// ... (logique)
EmitSignal(nameof(HealthChanged), 80);
}
// 7. Fonction (Callback)
private void OnMyButtonPressed()
{
GD.Print("Bouton pressé !");
}
}
Les nĆuds de physique 2D (sĂ©parĂ©s de la 3D).
| NĆud 2D | Usage | Ăquivalent Unity |
|---|---|---|
| StaticBody2D | Corps statique (ne bouge pas). (Ex: Sol, Murs). | Collider (sans Rigidbody) |
| RigidBody2D | Corps dynamique (contrÎlé par le moteur physique). (Ex: Caisse, Balle). | Rigidbody2D (Dynamique) |
| CharacterBody2D | Corps contrÎlé (par le script). (Ex: Joueur). (Utilise move_and_slide()). | Rigidbody2D (Kinematic) + .MovePosition() |
| Area2D | Trigger (Détection). Ne bloque pas. | Collider2D (Is Trigger = true) |
| CollisionShape2D | Enfant obligatoire. Définit la forme (Hitbox). | BoxCollider2D, CircleCollider2D |
Les nĆuds de physique 3D (sĂ©parĂ©s de la 2D).
| NĆud 3D | Usage | Ăquivalent Unity |
|---|---|---|
| StaticBody3D | Corps statique (Sol, Murs). | Collider (sans Rigidbody) |
| RigidBody3D | Corps dynamique (Gravité, Forces). (Caisse). | Rigidbody (Dynamique) |
| CharacterBody3D | Corps contrÎlé (Joueur). (move_and_slide()). | CharacterController (ou Rigidbody Kinematic) |
| Area3D | Trigger (Zone de détection). | Collider (Is Trigger = true) |
| CollisionShape3D | Enfant obligatoire. Définit la forme (Hitbox). | BoxCollider, SphereCollider |
Godot utilise un Input Map (Mappage d'Entrées) (Project > Project Settings > Input Map) pour abstraire les entrées. C'est l'équivalent de l'ancien "Input Manager" d'Unity.
Configuration (Input Map)
Vous créez des "Actions" (Noms) et vous y "bindez" (liez) des touches/boutons.
Action: "move_right" -> Key: D -> Key: Right Arrow -> Joypad: (Left Stick Right) Action: "jump" -> Key: Space -> Joypad: (Button A)
Scripting (GDScript)
On utilise Input (un Singleton global) pour vérifier ces Actions.
func _physics_process(delta):
var direction = 0
# --- Polling (Dans _process) ---
# Action (Axe)
# (Combine -1 (left) et +1 (right) en 1 seul axe)
direction = Input.get_axis("ui_left", "ui_right")
# Action (Booléen)
# (Juste pressé)
if Input.is_action_just_pressed("jump"):
velocity.y = JUMP_FORCE
# (Maintenu)
if Input.is_action_pressed("sprint"):
speed = SPRINT_SPEED
ĂvĂ©nement (_input)
Alternative (event-based) à _process. Recommandé pour les actions "pressées" (ex: Tirer).
func _input(event):
if event.is_action_pressed("fire_bullet"):
fire()
if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_LEFT:
print("Clic gauche !")
Godot 4 a été une réécriture majeure du moteur de rendu (Rendering Engine).
L'objectif est d'offrir une haute fidélité (similaire à UE/Unity HDRP) tout en restant performant sur des plateformes plus modestes.
Backends Vulkan (Défaut)
Godot 4 utilise Vulkan (API graphique moderne) par défaut pour la haute performance.
1. Forward+ (Haute Qualité)
(Défaut sur PC). Rendu de haute qualité, optimisé pour un grand nombre de lumiÚres (LumiÚres dynamiques, ombres...).
2. Mobile (Scalable)
Un pipeline de rendu plus simple, optimisé pour les appareils mobiles (limite le nombre de lumiÚres, effets réduits).
Backend GLES3 (Compatibilité)
Utilise OpenGL ES 3.0 (le standard "legacy").
Objectif : Compatibilité maximale.
- Vieux PC (qui ne supportent pas Vulkan).
- Vieux téléphones Android.
- Navigateurs Web (WebGL 2.0).
Control)L'interface utilisateur (UI) dans Godot est gĂ©rĂ©e par un type de nĆud spĂ©cial : Control.
Les nĆuds Control (ex: Button, Label, Panel) sont conçus pour ĂȘtre utilisĂ©s ensemble. Ils s'ancrent et se positionnent (responsive) les uns par rapport aux autres (via les Containers).
NĆuds Control (Courants)
Control: Le nĆudControlde base (agit comme undivvide).CanvasLayer: (Racine UI) Un nĆud (non-Control) qui dessine l'UI par-dessus le jeu 2D/3D (fixe Ă l'Ă©cran).Panel/PanelContainer: Un fond (background) colorĂ©.Label: Affiche du texte.Button: Un bouton (Ă©met le signalpressed()).LineEdit: Champ de saisie (Input text).
Containers (Layout)
Les "Containers" sont des nĆuds Control qui arrangent automatiquement leurs enfants (Ă©vite le positionnement manuel) :
VBoxContainer: Aligne les enfants verticalement.HBoxContainer: Aligne les enfants horizontalement.GridContainer: Aligne les enfants en grille.
Le processus d'exportation (Project > Export...) de Godot est trÚs simple, mais nécessite des Export Templates (ModÚles d'Exportation).
1. Télécharger les Templates
Pour exporter, vous devez d'abord télécharger les "Templates" (les "binaires" précompilés pour chaque plateforme) correspondant à votre version de Godot (ex: 4.2.1).
2. Configurer le "Preset" (Pré-réglage)
Dans la fenĂȘtre d'Export, vous ajoutez un "Preset" (ex: "Windows Desktop").
Options (Exemple Windows) :
- Binary (Binaire) :
.exe(Jeu) +.pck(Données/Assets). (OuEmbed PCKpour 1 seul.exe). - Icon : L'icÎne du
.exe. - Version Info : (Copyright, Nom...).
Export (Android/iOS)
L'export mobile nécessite une configuration plus complexe :
- Android : Nécessite le SDK Android, JDK (Java), et une Keystore (clé de signature).
- iOS : (Nécessite un Mac) Godot génÚre un projet Xcode, que vous devez ensuite compiler et signer avec Xcode.
