The Verse Academy.The Verse Academy.
Une île Fortnite pour apprendre Verse pas à pas. C’est le projet que je présente au UEFN Pro Bootcamp 2026 d’Epic Games : si ma candidature est retenue, voici ce que je construirai entre le 30 novembre 2026 et le 4 janvier 2027.A Fortnite island to learn Verse step by step. This is the project I am submitting to Epic Games’ UEFN Pro Bootcamp 2026: if I am selected, this is what I will build between 30 November 2026 and 4 January 2027.
Le constatThe gap
Epic prépare Unreal Engine 6 avec Verse au cœur de son modèle de programmation. Apprendre Verse aujourd’hui, c’est se préparer à cette transition. La documentation officielle et les tutoriels de la communauté sont de bonne qualité, mais ils vivent tous en dehors du jeu : on lit une page, puis on retourne dans l’éditeur.
À ma connaissance, aucune île Fortnite jouable n’est dédiée à l’apprentissage de Verse lui-même. The Verse Academy veut combler ce manque : apprendre Verse dans l’environnement où il s’exécute, en voyant immédiatement ce que chaque ligne change.
Epic is building Unreal Engine 6 with Verse at the heart of its programming model. Learning Verse today is a way to prepare for that transition. The official documentation and the community tutorials are good, but they all live outside the game: you read a page, then go back to the editor.
To my knowledge, no playable Fortnite island is dedicated to learning Verse itself. The Verse Academy aims to fill that gap: learning Verse inside the environment where it runs, and seeing straight away what each line changes.
Une méthode déjà éprouvéeA method already in use
The Verse Academy transpose la méthode de tous mes cours : un projet fil rouge qui grandit séance après séance. Son modèle direct est Asteroid Defender, mon cours d’introduction à Python en douze séances de deux heures, pour des étudiants qui n’ont jamais programmé.The Verse Academy carries over the method behind all my courses: one thread project that grows session after session. Its direct model is Asteroid Defender, my introductory Python course in twelve two-hour sessions, for students who have never programmed.
Les étudiants ne font pas d’exercices déconnectés. Ils font vivre un seul jeu, séance après séance. Le moteur est fourni et verrouillé ; ils n’écrivent que dans leurs propres fichiers. Au premier lancement, le vaisseau est là mais ne bouge pas et ne tire pas. Chaque notion apprise débloque une fonctionnalité visible : le score, les règles, les vagues, les armes, les ennemis, les meilleurs scores. À la fin du semestre, chacun ajoute une fonctionnalité personnelle à un jeu complet.
Students do not work on disconnected exercises. They bring one single game to life, session after session. The engine is provided and locked; they only write in their own files. On first launch, the ship is there but does not move or shoot. Each concept they learn unlocks a visible feature: score, rules, waves, weapons, enemies, high scores. At the end of the term, each student adds a personal feature to a complete game.
Expliquer avant de manipulerExplain before doing
Aucune notion n’est utilisée avant d’avoir été vue, même de façon anodine. Le jeu impose l’ordre : chaque notion arrive quand il en a besoin.No concept is used before it has been taught, not even in passing. The game sets the order: each concept arrives when the game needs it.
Le jeu ne plante jamaisThe game never crashes
Ce que l’étudiant n’a pas encore écrit tourne sur une valeur par défaut. Ce défaut annonce ce qui manque ; il ne ressemble jamais à une réponse juste.Whatever the student has not written yet runs on a default value. That default says what is missing; it never looks like a correct answer.
Le jeu montre ce qu’il attendThe game shows what it expects
En pause, survoler un élément affiche le nom exact que le moteur attend. Le jeu devient la carte de ce qu’il reste à écrire.In pause mode, hovering an element shows the exact name the engine expects. The game becomes the map of what is left to write.
Reprendre la mainTaking over
À chaque chapitre, une mécanique que le moteur gérait seul passe sous le contrôle de l’étudiant. C’est le fil narratif du semestre.In each chapter, a mechanic the engine used to handle alone passes under the student’s control. It is the narrative thread of the term.
Trois niveaux par exerciceThree levels per exercise
Un socle obligatoire, un renfort sur la même notion, une mission bonus qui n’utilise que des notions déjà acquises.A required core task, a reinforcement on the same concept, and a bonus mission that only uses concepts already learned.
Un guidage qui s’effaceGuidance that fades
Le premier exemple est donné en entier ; les suivants sont décrits en mots et écrits par analogie. Lire une erreur s’apprend dès la première séance.The first example is given in full; the next ones are described in words and written by analogy. Reading an error is taught from the very first session.
De Python à Verse : la carte de l’îleFrom Python to Verse: the island map
Au centre, une arène : Core Defender, un jeu de défense où l’on protège un cœur arcanique contre des vagues de drones. C’est le jeu fil rouge. Autour, douze ailes ; chacune correspond à un chapitre du cours Python et fait passer une mécanique de l’arène sous le contrôle de l’apprenant.In the centre, an arena: Core Defender, a defence game in which you protect an arcane core against waves of drones. It is the thread game. Around it, twelve wings; each matches a chapter of the Python course and hands one arena mechanic over to the learner.
| AileWing | Chapitre Python d’origineOriginal Python chapter | Ce que l’apprenant reprend en mainWhat the learner takes over |
|---|---|---|
| 01 · Noms et valeursNames and values | Ch. 1 — Variables : prise en mainCh. 1 — Variables: getting started | Le réglage de départ de l’arène : titre, munitions, points de vie du cœur, nom du joueur au HUD, vitesse des drones.The arena’s starting setup: title, ammo, core health, player name on the HUD, drone speed. |
| 02 · Calculs et scoreMaths and score | Ch. 2 — Opérateurs : le score prend vieCh. 2 — Operators: the score comes alive | Le calcul du score : points par drone abattu, bonus de série, multiplicateur de vague.Scoring: points per drone, streak bonus, wave multiplier. |
| 03 · Décisions et échecDecisions and failure | Ch. 3 — Conditions : le jeu décideCh. 3 — Conditions: the game decides | Les règles : alerte « cœur critique », état du bouclier affiché, condition de fin de partie.The rules: “core critical” alert, shield state on the HUD, game-over condition. |
| 04 · BouclesLoops | Ch. 4 — Boucles jouées au ralentiCh. 4 — Loops in slow motion | Le compte à rebours de vague et l’apparition des drones un par un.The wave countdown and spawning drones one by one. |
| 05 · CollectionsCollections | Ch. 5 — Collections : le chapitre du plurielCh. 5 — Collections: things in the plural | Les armes sélectionnables, les couleurs des drones, les formations.Selectable weapons, drone colours, formations. |
| 06 · FonctionsFunctions | Ch. 6 — Fonctions : nommer un gesteCh. 6 — Functions: naming an action | Les dégâts, la composition des vagues, la difficulté, le texte du HUD.Damage, wave composition, difficulty, HUD text. |
| 07 · Portée et récursionScope and recursion | Ch. 7 — Portée et récursionCh. 7 — Scope and recursion | Les motifs de tir en éventail ou en spirale, construits par récursion.Fan and spiral firing patterns, built recursively. |
| 08 · Classes et devicesClasses and devices | Ch. 8 — Classes : objets, attributs, méthodesCh. 8 — Classes: objects, fields, methods | Le temps de recharge des armes et les bonus, gérés jusque-là par l’île.Weapon cooldown and power-ups, so far handled by the island. |
| 09 · Héritage et interfacesInheritance and interfaces | Ch. 9 — Héritage et polymorphismeCh. 9 — Inheritance and polymorphism | Le comportement des drones : kamikaze, zigzag, boss.Drone behaviour: kamikaze, zigzag, boss. |
| 10 · Échec, transactions et débogageFailure, transactions and debugging | Ch. 10 — Débogage et exceptions : le filetCh. 10 — Debugging and exceptions: the safety net | Le filet lui-même : le mode dégradé qui protège l’apprenant depuis l’aile 1 devient le sujet de l’aile.The safety net itself: the fallback mode that has protected the learner since wing 1 becomes the topic. |
| 11 · Temps et concurrenceTime and concurrency | Sans équivalent Python : aile propre à VerseNo Python equivalent: a Verse-only wing | Le rythme des vagues, la durée des bonus, les phases du boss contre la montre.Wave pacing, power-up duration, boss phases against the clock. |
| 12 · Mémoire et modulesMemory and modules | Ch. 11 et 12 — Fichiers, puis modulesCh. 11 and 12 — Files, then modules | Les meilleurs scores, qui survivent à la fin de la session, et l’architecture du projet.Best scores that survive the end of the session, and the project’s architecture. |
| Final · Projet personnelFinal · Personal project | Ch. 12 — Projet finalCh. 12 — Final project | Une fonctionnalité de son choix, qui combine au moins trois ailes.A feature of their choice that combines at least three wings. |
Une aile, quatre sallesOne wing, four rooms
Chaque aile suit le même parcours. On le traverse en jouant, sans rien installer.Every wing follows the same path. You walk through it by playing, with nothing to install.
VoirSee
La mécanique de l’aile tourne dans l’arène, d’abord avec la valeur par défaut, puis avec une version réussie. On voit la différence avant de lire une ligne de code.The wing’s mechanic runs in the arena, first on its default value, then in a working version. You see the difference before reading a single line of code.
LireRead
Des panneaux dans le décor montrent le code Verse qui pilote ce qu’on vient de voir, et le nom exact que l’île attend. La notion est expliquée avant d’être manipulée.Panels in the level show the Verse code driving what you just saw, and the exact name the island expects. The concept is explained before it is used.
PrédirePredict
Un extrait de code au mur, trois portes. Seule la bonne réponse ouvre la suite. C’est l’exercice de déroulé de code à la main de mes cours, transformé en salle de jeu.A code snippet on the wall, three doors. Only the right answer opens the way. It is the code-tracing exercise from my courses, turned into a game room.
Reprendre la mainTake over
Une carte de mission renvoie au projet de départ : socle, renfort, mission bonus. L’apprenant écrit son code, pousse ses changements et voit l’arène lui obéir.A mission card points to the starter project: core task, reinforcement, bonus mission. The learner writes the code, pushes the changes and sees the arena follow it.
Jouer, puis construirePlay, then build
On n’écrit pas de code depuis Fortnite. Le projet fonctionne donc sur deux niveaux, et le second prolonge le premier.Nobody writes code from inside Fortnite. The project therefore works on two levels, the second extending the first.
L’île publiéeThe published island
Accessible à tout joueur de Fortnite. On y apprend à lire Verse : voir, lire, prédire. C’est la porte d’entrée, sans installation ni prérequis.Open to any Fortnite player. It teaches how to read Verse: see, read, predict. It is the entry point, with no setup and no prerequisites.
Le projet de départThe starter project
Le projet UEFN de Core Defender, partagé publiquement. Le code de l’arène est verrouillé ; l’apprenant n’écrit que dans son propre fichier Verse, qui s’enrichit d’une section par aile. Il modifie, pousse ses changements Verse dans la session d’édition en direct, et observe.The Core Defender UEFN project, shared publicly. The arena code is locked; the learner only writes in their own Verse file, which grows by one section per wing. Edit, push the Verse changes to the live edit session, observe.
# academy_config.verse — aile 1
# Le seul fichier à modifier. Le reste de l'île est verrouillé.
# Titre affiché au-dessus de l'arène
ArenaTitle:string = "Core Defender"
# Munitions en début de partie
StartingAmmo:int = 30
# Points de vie du cœur
CoreHealth:int = 500
# Vitesse des drones (1.0 = normale)
DroneSpeed:float = 1.5
# academy_config.verse — wing 1
# The only file to edit. The rest of the island is locked.
# Title shown above the arena
ArenaTitle:string = "Core Defender"
# Ammo at the start of a game
StartingAmmo:int = 30
# Core health points
CoreHealth:int = 500
# Drone speed (1.0 = normal)
DroneSpeed:float = 1.5
La question technique à résoudre au bootcamp. En Python, mon moteur vérifie à l’exécution si une variable existe : un nom absent laisse simplement la fonctionnalité éteinte. Verse est compilé et typé statiquement : un nom absent est une erreur de compilation.
Le fichier de départ contient donc, aile par aile, des définitions déjà présentes avec des valeurs volontairement inachevées : un cœur à 1 point de vie, un HUD qui indique ce qu’il reste à écrire. Rendre cette expérience aussi fluide qu’en Python est le premier chantier technique que je veux mener pendant le bootcamp.
The technical question to solve during the bootcamp. In Python, my engine checks at runtime whether a variable exists: a missing name simply leaves the feature switched off. Verse is compiled and statically typed: a missing name is a compile error.
So the starter file holds, wing by wing, definitions that already exist with deliberately unfinished values: a core with 1 health point, a HUD that says what is left to write. Making this feel as smooth as the Python version is the first technical task I want to work on during the bootcamp.
Les douze ailes en détailThe twelve wings in detail
Contenu de travail : il sera ajusté pendant le bootcamp. Cliquer sur une aile pour l’ouvrir.Working draft: it will be adjusted during the bootcamp. Click a wing to open it.
01 Noms et valeursNames and valuesCh. 1 — Variables : prise en mainCh. 1 — Variables: getting started BootcampBootcamp
StartingAmmo:int = 30. Types int, float, string. Commentaires #. Lire une erreur de compilation.A definition is a name, a type and a value: StartingAmmo:int = 30. Types int, float, string. # comments. Reading a compile error.ArenaTitle · StartingAmmo · CoreHealth · PlayerName · DroneSpeedDroneSpeed:float = 2 — accepté ou refusé ? (Refusé : un float s’écrit 2.0.)DroneSpeed:float = 2 — accepted or refused? (Refused: a float is written 2.0.)02 Calculs et scoreMaths and scoreCh. 2 — Opérateurs : le score prend vieCh. 2 — Operators: the score comes alive BootcampBootcamp
int et float ne se mélangent pas sans conversion explicite. Première variable : var Score:int = 0 et set.Arithmetic and comparison operators. int and float do not mix without an explicit conversion. First variable: var Score:int = 0 and set.PointsPerHit · StreakBonus · WaveMultiplier · var ScoreScore:int = 0 puis set Score = Score + 10 : que dit le compilateur ? (Refus : sans var, c’est une constante.)Score:int = 0 then set Score = Score + 10: what does the compiler say? (Refused: without var it is a constant.)float à partir d’entiers, conversion comprise.Compute a wave speed as a float from integers, conversion included.03 Décisions et échecDecisions and failureCh. 3 — Conditions : le jeu décideCh. 3 — Conditions: the game decides BootcampBootcamp
logic, comparaisons, if / else. Première rencontre avec l’échec : une expression qui peut échouer, comme Drones[5], se place dans un contexte d’échec au lieu de faire planter le jeu.logic, comparisons, if / else. First contact with failure: an expression that may fail, such as Drones[5], lives in a failure context instead of crashing the game.if (D := Drones[5]): — quelle branche s’exécute ? (Le else : l’accès échoue, rien ne plante.)Three drones in play, if (D := Drones[5]): — which branch runs? (The else: the access fails, nothing crashes.)if / else if / else.Three shield states with if / else if / else.04 BouclesLoopsCh. 4 — Boucles jouées au ralentiCh. 4 — Loops in slow motion Si le temps le permetStretch goal
for (I := 1..N) (bornes incluses), for (D : Drones), filtres dans le for, loop et break. L’île rejoue chaque tour de boucle au ralenti pour le rendre visible.for (I := 1..N) (inclusive bounds), for (D : Drones), filters inside for, loop and break. The island replays each iteration in slow motion to make it visible.for · loop · breakfor (I := 1..3) : combien de drones apparaissent ? (Trois.)for (I := 1..3): how many drones spawn? (Three.)loop qui s’arrête d’elle-même quand la vague est vide.A loop that stops itself once the wave is empty.05 CollectionsCollectionsCh. 5 — Collections : le chapitre du plurielCh. 5 — Collections: things in the plural Feuille de routeRoadmap
[]int, maps [string]int, tuples, options ?int. Lire une case qui n’existe pas échoue proprement.Arrays []int, maps [string]int, tuples, options ?int. Reading a slot that does not exist fails cleanly.Weapons · WeaponDamage · DroneColors · StartPositionWeaponDamage["Laser"] sans clé « Laser » : que se passe-t-il ? (L’accès échoue, la branche de repli s’exécute.)WeaponDamage["Laser"] with no “Laser” key: what happens? (The access fails, the fallback branch runs.)06 FonctionsFunctionsCh. 6 — Fonctions : nommer un gesteCh. 6 — Functions: naming an action Feuille de routeRoadmap
Damage(Base:float, Multiplier:float):float · SpawnPattern(Wave:int):tuple(int, float) · HudText(Name:string, Score:int):stringSpawnPattern(3) pour le code affiché au mur ?What does SpawnPattern(3) return for the code on the wall?07 Portée et récursionScope and recursionCh. 7 — Portée et récursionCh. 7 — Scope and recursion Feuille de routeRoadmap
FanPattern(N:int):[]floatFanPattern(3) ? Dans quel ordre ?How many angles does FanPattern(3) return? In what order?08 Classes et devicesClasses and devicesCh. 8 — Classes : objets, attributs, méthodesCh. 8 — Classes: objects, fields, methods Feuille de routeRoadmap
class, champs, méthodes, instances. Le cas particulier du creative_device, de @editable et de OnBegin.class, fields, methods, instances. The special case of creative_device, @editable and OnBegin.weapon · power_up · CanFire() · Fire()weapon, on modifie l’une : l’autre change-t-elle ?Two weapon instances, one is modified: does the other change?weapon avec son propre temps de recharge.A weapon class with its own cooldown.@editable.A custom device tuned from the editor with @editable.09 Héritage et interfacesInheritance and interfacesCh. 9 — Héritage et polymorphismeCh. 9 — Inheritance and polymorphism Feuille de routeRoadmap
<override>, interfaces. La boucle de l’île traite tous les drones sans connaître leur type exact.Subclasses, <override>, interfaces. The island’s loop handles every drone without knowing its exact type.drone · kamikaze_drone · zigzag_drone · boss_dronezigzag_drone, quelle méthode Move() l’île appelle-t-elle ?For a zigzag_drone, which Move() does the island call?10 Échec, transactions et débogageFailure, transactions and debuggingCh. 10 — Débogage et exceptions : le filetCh. 10 — Debugging and exceptions: the safety net Feuille de routeRoadmap
<decides>, <transacts> et l’annulation des effets quand un contexte échoue, options, journal Verse et débogage dans UEFN.Verse has no exceptions: failure is part of the language. <decides>, <transacts> and rolled-back effects when a context fails, options, the Verse log and debugging in UEFN.ValidWave[Wave:int] · un achat en boutique qui ne débite qu’en cas de réussiteValidWave[Wave:int] · a shop purchase that only charges on success11 Temps et concurrenceTime and concurrencySans équivalent Python : aile propre à VerseNo Python equivalent: a Verse-only wing Feuille de routeRoadmap
<suspends>, Sleep(), spawn, race, sync, rush, attente et abonnement aux événements des devices.<suspends>, Sleep(), spawn, race, sync, rush, awaiting and subscribing to device events.race: · spawn{} · Sleep() · Subscribe()race entre Sleep(3.0) et une phase de boss de 5 secondes : qui gagne, et qu’advient-il de l’autre ?A race between Sleep(3.0) and a 5-second boss phase: which wins, and what happens to the other?12 Mémoire et modulesMemory and modulesCh. 11 et 12 — Fichiers, puis modulesCh. 11 and 12 — Files, then modules Feuille de routeRoadmap
weak_map(player, …) et classes <persistable>), organisation du code en modules et using.Per-player persistent data (weak_map(player, …) and <persistable> classes), organising code into modules and using.player_record · SaveBest() · LoadBest()Sa propre version de Core DefenderYour own version of Core Defender
Comme à la fin de mon cours Python, chacun ajoute une fonctionnalité de son choix qui réutilise au moins trois ailes : un boss avec barre de vie (ailes 8 et 9), un tir à tête chercheuse (ailes 5 et 6), un bouclier temporaire (ailes 3 et 11), un classement persistant par saison (ailes 5 et 12).As at the end of my Python course, each learner adds a feature of their choice that reuses at least three wings: a boss with a health bar (wings 8 and 9), a homing shot (wings 5 and 6), a timed shield (wings 3 and 11), a persistent seasonal leaderboard (wings 5 and 12).
Le bootcamp, semaine par semaineThe bootcamp, week by week
Objectif réaliste : une arène jouable et trois ailes complètes, publiées dans les délais.A realistic goal: a playable arena and three complete wings, published on time.
-
Avant le 30 nov.Before 30 Nov
PréparationPreparation
Rédaction complète des ailes 1 à 3 : textes des panneaux, questions des salles « Prédire », cartes de mission. Plan de l’arène sur papier.Full write-up of wings 1 to 3: panel texts, “Predict” questions, mission cards. Arena layout on paper.
-
30 nov. – 4 déc.30 Nov – 4 Dec
Formation et arèneTraining and arena
Sessions du bootcamp. Maquette du hub et de l’arène, boucle de vagues de Core Defender dans le code verrouillé.Bootcamp sessions. Blockout of the hub and the arena, Core Defender’s wave loop in the locked code.
-
7 – 11 déc.7 – 11 Dec
Ailes 1 et 2Wings 1 and 2
Salles Voir, Lire et Prédire ; sections 1 et 2 du fichier de l’apprenant ; valeurs par défaut qui annoncent ce qui manque.See, Read and Predict rooms; sections 1 and 2 of the learner file; defaults that say what is missing.
-
14 – 18 déc.14 – 18 Dec
Aile 3 et premiers testsWing 3 and first playtests
Règles et contexte d’échec ; tests avec des joueurs qui n’ont jamais programmé ; corrections.Rules and failure context; playtests with players who have never programmed; fixes.
-
19 déc. – 4 janv.19 Dec – 4 Jan
Finition et publicationPolish and publishing
Lisibilité des panneaux, performances, publication de l’île avant le 4 janvier ; mise en ligne du projet de départ et de son guide.Panel readability, performance, island published before 4 January; starter project and its guide put online.
-
15 janv. 202715 Jan 2027
Showcase
Présentation de l’île et du dispositif.Presentation of the island and how it works.
Après le bootcampAfter the bootcamp
Feuille de route 20272027 roadmap
- Premier trimestre : ailes 4 à 6.First quarter: wings 4 to 6.
- Deuxième trimestre : ailes 7 à 9.Second quarter: wings 7 to 9.
- Troisième trimestre : ailes 10 à 12 et projet final.Third quarter: wings 10 to 12 and the final project.
- Textes de l’île en anglais, puis en français.Island texts in English, then in French.
- Utilisation prévue dans mes propres cours Unreal.Planned use in my own Unreal courses.
Ce que je mesureraiWhat I will measure
- Statistiques du Creator Portal : parties, temps de jeu, rétention.Creator Portal analytics: plays, playtime, retention.
- Taux de réussite au premier essai dans les salles « Prédire ».First-try success rate in the “Predict” rooms.
- Ailes terminées par joueur, et où les joueurs s’arrêtent.Wings completed per player, and where players stop.
- Téléchargements du projet de départ et retours des apprenants.Starter project downloads and learner feedback.
Qui porte le projetWho is behind it
Dominique Yolin, fondateur d’Arcreane, Unreal Authorized Instructor certifié par Epic Games. J’enseigne Unreal depuis cinq ans (Blueprint et C++), ainsi que la programmation GPU (CUDA, compute shaders sous Unreal) et les langages objet, de la première à la cinquième année, dans des écoles d’ingénieurs et de jeu vidéo françaises reconnues. Mes cours sont construits autour du jeu vidéo et d’un projet fil rouge, avec un Moodle et des exercices auto-corrigés CodeRunner que j’héberge moi-même.
Côté développement : vingt ans de C++ temps réel et image, deux diplômes d’ingénieur (génie logiciel en 2002, programmation 3D temps réel en 2015), des fonctionnalités de Twinmotion sur Unreal Engine 5, des plugins Unreal, un plugin pour Nuke, et des hackathons temps réel organisés avec Light in Chaos. Je participe régulièrement à des game jams sur Unreal.
Dominique Yolin, founder of Arcreane, Unreal Authorized Instructor certified by Epic Games. I have been teaching Unreal for five years (Blueprint and C++), as well as GPU programming (CUDA, compute shaders in Unreal) and object-oriented languages, from first to fifth year, in top-ranked French engineering and game development schools. My courses are built around game development and a single thread project, with a Moodle and auto-graded CodeRunner exercises that I host myself.
On the development side: twenty years of real-time and imaging C++, two engineering degrees (software engineering in 2002, real-time 3D programming in 2015), Twinmotion features on Unreal Engine 5, Unreal plugins, a plugin for Nuke, and real-time hackathons organised with Light in Chaos. I regularly take part in Unreal game jams.