Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

đŸŽČ Godot 4 – Moteur de Jeu Open Source (GDScript, C#)

Guide complet IDEO-Lab sur le moteur de jeu 2D/3D libre et open-source.

1.1

Concept : Moteur Libre

Open Source (MIT), 2D/3D, léger, "Nodes".

Godot Open Source MIT License
1.2

Installation & Versions

Standard (GDScript) vs. .NET (C#). Pas d'installateur.

GDScript C# / .NET
1.3

vs. Unity / Unreal

Philosophie (Nodes vs Components), Poids, Langage.

Unity Unreal Comparatif
2.1

Concept : Scene & Node

Scùne (Arbre de NƓuds), NƓud (Brique de base).

Scene Node Arborescence
2.2

Types de NƓuds (Nodes)

Node2D, Node3D (Spatial), Control (UI).

Node2D Node3D Control
2.3

Instanciation de ScĂšnes

Composition (Scùnes dans Scùnes). (Équiv. Prefab).

Instancing Prefab
3.1

GDScript : Vue d'ensemble

Langage (Python-like), Typage (Dynamique/Statique).

GDScript Python-like Typage Statique
3.2

GDScript : Cycle de Vie

_ready(), _process() (Frame), _physics_process().

_ready() _process()
3.3

GDScript : NƓuds & Signaux

AccĂšs ($NodeName), export, Signaux (connect).

$ (Dollar) @export Signals
4.1

C# (dotnet) : Vue d'ensemble

Version Godot Mono, .NET 6/7. Godot.Node.

C# .NET
4.2

C# : Cycle de Vie

_Ready(), _Process(), _PhysicsProcess().

_Ready() _Process()
4.3

C# : NƓuds & Signaux

GetNode(), [Export], [Signal], Connect().

[Export] GetNode [Signal]
5.1

Physique 2D

CharacterBody2D, StaticBody2D, Area2D (Trigger).

CharacterBody2D Area2D
5.2

Physique 3D

CharacterBody3D, RigidBody3D, Area3D.

CharacterBody3D RigidBody3D
5.3

Input Map

Input.is_action_pressed(), _input().

Input Map _input()
6.1

Rendu (Godot 4)

Vulkan (Forward+ / Mobile) & Compatibility (GLES3).

Vulkan GLES3
6.2

UI (NƓuds Control)

Button, Label, Panel. ThĂšmes.

Control UI
6.3

Export (Build)

Export Templates (PC, Mac, Linux, Web, Android, iOS).

Export Templates
1.1 Concept : Moteur de Jeu Libre & Open Source
Qu'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)
1.2 Installation & Versions (Standard vs .NET)

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#.

1.3 Comparaison : Godot vs. Unity
CritĂšreGodotUnity
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 PrincipalGDScript (Python-like, intégré).C# (Support C# supérieur).
LicenceOpen 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 2DExcellent (Considéré comme supérieur, pixels natifs).Bon (mais souvent considéré comme un moteur 3D "adapté").
Focus 3DBon (Godot 4/Vulkan). (Rattrape son retard).Excellent (Maturité, HDRP, écosystÚme).
ÉcosystùmeBon (Asset Library).Immense (Asset Store).
2.1 Concept : Scene & Node (NƓud)
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)
2.2 Types de NƓuds (HiĂ©rarchie de Base)

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)
2.3 Instanciation de Scùnes (Équiv. Prefab)

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
  1. ScĂšne 1 (Player.tscn) :
    CharacterBody2D (Root)
      ├ Sprite2D
      └ CollisionShape2D
  2. ScĂšne 2 (Bullet.tscn) :
    Area2D (Root)
      ├ Sprite2D
      └ CollisionShape2D
  3. 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
3.1 GDScript : Vue d'ensemble

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).
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()
3.2 GDScript : Cycle de Vie

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()).
3.3 GDScript : Accùs aux NƓuds & Signaux
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")
4.1 C# (dotnet) : Vue d'ensemble

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 soient partial.
  • IDE : Le code est Ă©ditĂ© dans un IDE externe (VS Code, Visual Studio, Rider). Godot gĂšre la solution (.sln) et la compilation.
4.2 C# : Cycle de Vie

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.
4.3 C# : NƓuds, Exports & Signaux

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é !");
    }
}
5.1 Physique 2D

Les nƓuds de physique 2D (sĂ©parĂ©s de la 3D).

NƓud 2DUsageÉquivalent Unity
StaticBody2DCorps statique (ne bouge pas). (Ex: Sol, Murs).Collider (sans Rigidbody)
RigidBody2DCorps dynamique (contrÎlé par le moteur physique). (Ex: Caisse, Balle).Rigidbody2D (Dynamique)
CharacterBody2DCorps contrÎlé (par le script). (Ex: Joueur). (Utilise move_and_slide()).Rigidbody2D (Kinematic) + .MovePosition()
Area2DTrigger (Détection). Ne bloque pas.Collider2D (Is Trigger = true)
CollisionShape2DEnfant obligatoire. Définit la forme (Hitbox).BoxCollider2D, CircleCollider2D
5.2 Physique 3D

Les nƓuds de physique 3D (sĂ©parĂ©s de la 2D).

NƓud 3DUsageÉquivalent Unity
StaticBody3DCorps statique (Sol, Murs).Collider (sans Rigidbody)
RigidBody3DCorps dynamique (Gravité, Forces). (Caisse).Rigidbody (Dynamique)
CharacterBody3DCorps contrÎlé (Joueur). (move_and_slide()).CharacterController (ou Rigidbody Kinematic)
Area3DTrigger (Zone de détection).Collider (Is Trigger = true)
CollisionShape3DEnfant obligatoire. Définit la forme (Hitbox).BoxCollider, SphereCollider
5.3 Input Map (Gestion des Entrées)

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 !")
6.1 Rendu (Godot 4)

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).
6.2 UI (NƓuds 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Ɠud Control de base (agit comme un div vide).
  • 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 signal pressed()).
  • 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.
6.3 Export (Build)

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). (Ou Embed PCK pour 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.