Island Pilot · Fonctionnalités · Agents · Blog

Apprendre Verse, le langage de Fortnite

Apprendre Verse vous ouvre tout ce que les devices ne savent pas faire dans UEFN (Unreal Editor for Fortnite). Ce langage conçu par Epic Games a ses propres règles : les conditions reposent sur l’échec, les fonctions déclarent leurs effets et l’attente se gère sans callbacks. Voici les notions à comprendre, un exemple commenté et un parcours pour progresser.

Qu’est-ce que Verse ?

Verse est le langage de programmation d’UEFN, présenté par Epic Games avec l’éditeur lors de la GDC de mars 2023 (Epic). Epic le décrit comme un langage pensé pour les jeux vidéo et les expériences 3D en temps réel (Epic). Il mêle programmation fonctionnelle, logique et impérative (Book of Verse).

Dans UEFN, on écrit surtout des devices Verse : des classes que l’on place dans le niveau comme n’importe quel device, et qui pilotent les autres. Verse sert aussi à créer des composants pour le Scene Graph, le système d’entités d’Epic.

Apprendre Verse est un investissement qui dépasse Fortnite. En juin 2026, Epic a annoncé Unreal Engine 6, qui réunit Unreal Engine 5 et UEFN en un seul produit, avec Verse et le Scene Graph au centre ; un accès anticipé est prévu fin 2027 (GamingOnLinux).

Les contextes d’échec : la notion qui surprend le plus

Dans la plupart des langages, une condition est un booléen, vrai ou faux. En Verse, beaucoup d’expressions peuvent échouer : une comparaison fausse, un accès à un tableau hors limites, une division entière par zéro. Échouer n’est pas une erreur : l’expression ne produit simplement pas de valeur (Book of Verse).

Une expression qui peut échouer doit se trouver dans un contexte d’échec, par exemple la condition d’un if ou le domaine d’un for (Epic). Trois conséquences pratiques :

  • Un accès à un tableau se teste en même temps qu’il se fait : if (Value := Scores[2]): n’exécute le bloc que si la case existe.
  • Une fonction qui peut échouer porte l’effet <decides> et s’appelle avec des crochets : FindPlayer[Name] au lieu de FindPlayer(Name).
  • Les changements sont annulés en cas d’échec : si une expression échoue dans un bloc if, les modifications de variables faites plus tôt dans ce bloc sont défaites.

Ce mécanisme remplace à la fois les tests de valeur nulle, les vérifications de bornes et une partie des exceptions. Il déroute au début, puis devient vite naturel.

Les spécificateurs d’effets : ce qu’une fonction a le droit de faire

Chaque fonction Verse déclare ses effets, c’est-à-dire les catégories de comportement qu’elle peut avoir (Epic). Le compilateur vérifie qu’elle ne fait rien de plus que ce qu’elle annonce. Les plus courants :

EffetSignificationEn pratique
<decides>La fonction peut échouerElle s’appelle avec des crochets, dans un contexte d’échec
<suspends>La fonction peut se mettre en pause et reprendre plus tard, sur plusieurs framesIndispensable pour Sleep, attendre un évènement ou utiliser race et sync
<transacts>Ses actions peuvent être annuléesLa documentation d’Epic précise qu’une fonction <decides> doit aussi la porter
<computes>Calcul pur, sans effet de bordPour les fonctions utilitaires sans état

Deux règles à retenir : un effet se propage, donc une fonction qui appelle une fonction <suspends> doit elle-même être <suspends> (Book of Verse) ; et <decides> et <suspends> ne se combinent pas sur la même fonction (Book of Verse).

La concurrence en Verse : spawn, race, sync, rush et branch

Un jeu passe son temps à attendre : la fin d’un compte à rebours, l’appui sur un bouton, l’élimination d’un joueur. Verse intègre cette attente au langage : une fonction <suspends> peut appeler Sleep(5.0) ou attendre un évènement, et des expressions dédiées font tourner plusieurs tâches en parallèle (Book of Verse).

ExpressionCe qu’elle fait
syncLance toutes ses branches en même temps et attend qu’elles soient toutes terminées
raceLance ses branches en même temps ; la première qui termine gagne, les autres sont annulées
rushComme race, mais les autres branches continuent en arrière-plan
branchLance un bloc en arrière-plan et continue aussitôt ; il est annulé quand la fonction qui le contient se termine
spawnLance une tâche indépendante, qui peut survivre au code qui l’a créée

Les quatre premières sont dites structurées : leur durée de vie est liée au bloc qui les contient, ce qui évite les tâches oubliées. spawn sert d’échappatoire, à réserver aux tâches qui doivent vraiment continuer seules. Méfiez-vous en particulier d’un spawn placé dans une boucle : s’il lance des fonctions qui ne se terminent jamais, il en crée jusqu’à provoquer une erreur d’exécution (Epic).

Un exemple Verse commenté

Ce device affiche la première réponse d’une liste, puis laisse dix secondes à un joueur pour appuyer sur un bouton. Il réunit les trois notions précédentes. Le fichier commence par les trois lignes using générées par le modèle Verse Device : using { /Fortnite.com/Devices }, using { /Verse.org/Simulation } et using { /UnrealEngine.com/Temporary/Diagnostics }.

CodeCe qu’il fait
quiz_device := class(creative_device):Déclare un device Verse. Après compilation, il apparaît dans le Content Browser et se place dans le niveau.
    @editableRend le champ suivant réglable dans le panneau Details de l’éditeur.
    Button : button_device = button_device{}Un bouton du niveau, que vous relierez dans l’éditeur.
    Answers : []string = array{"Rouge", "Vert", "Bleu"}Un tableau de chaînes de caractères.
    OnBegin<override>()<suspends>:void =S’exécute au lancement de la partie ; <suspends> l’autorise à attendre.
        if (First := Answers[0]):Accès au tableau dans un contexte d’échec : le bloc ne s’exécute que si la case 0 existe.
            Print("Première réponse : {First}")Écrit la valeur dans le journal, grâce à l’interpolation entre accolades.
        Winner := race:Lance les deux blocs suivants en même temps et garde la valeur du premier qui termine.
            block:Premier concurrent…
                Sleep(10.0)…attend dix secondes…
                "temps écoulé"…puis renvoie ce texte.
            block:Second concurrent…
                Button.InteractedWithEvent.Await()…attend qu’un joueur appuie sur le bouton…
                "bouton pressé"…puis renvoie ce texte. Le bloc perdant est annulé.
        Print("Résultat : {Winner}")Affiche « temps écoulé » ou « bouton pressé ».

Pour l’essayer, lancez Verse > Build Verse Code, placez quiz_device dans le niveau, choisissez un bouton du niveau dans son champ Button, puis cliquez sur Launch Session et ouvrez Island Settings > Log en jeu (Epic).

Par où commencer pour apprendre Verse : parcours et ressources officielles

  1. Les bases, sans prérequis. La série officielle « Learn the Basics of Writing Code in Verse » s’adresse aux personnes qui n’ont jamais programmé : neuf leçons de 3 à 10 minutes, chacune suivie d’un exercice (Epic).
  2. Votre premier programme. Le tutoriel « Modify and Run Your First Verse Program » montre comment créer, compiler et lancer un device Verse dans UEFN (Epic).
  3. Les Feature Examples. Dans le Project Browser d’UEFN, ces projets d’exemple illustrent une fonction ou un usage de Verse, prêts à décortiquer (Epic).
  4. La référence du langage. Le Book of Verse, publié par Epic sur GitHub, couvre le langage en profondeur. Il suit la branche de développement principale : certaines fonctions qu’il décrit peuvent ne pas être encore disponibles dans UEFN (Epic).
  5. La référence de l’API. Pour les devices et les fonctions de Fortnite, consultez la référence de l’API Verse.
  6. Vos propres petits devices. Un compte à rebours, un tableau des scores, une porte à code : un projet par notion, puis combinez-les.

Gardez aussi le glossaire Verse d’Epic à portée de main pour retrouver le sens d’un terme en cours de route.

Les erreurs fréquentes quand on apprend Verse

  • Appeler une fonction <decides> hors d’un contexte d’échec. Le compilateur signale alors « This invocation calls a function that has the 'decides' effect ». Placez l’appel dans un if, ou prévoyez une valeur de repli avec or (forum Epic).
  • Confondre parenthèses et crochets. Une fonction qui peut échouer s’appelle avec des crochets, les autres avec des parenthèses.
  • Oublier <suspends>. Toute fonction qui appelle Sleep, Await ou race doit être <suspends>, et l’effet remonte la chaîne d’appels.
  • Mélanger int et float. Aucune conversion n’est implicite : multipliez un entier par 1.0 pour obtenir un float, et utilisez Floor, Round, Ceil ou Int dans l’autre sens, avec des crochets, car ces conversions peuvent échouer. La division de deux entiers peut elle aussi échouer, et renvoie un rationnel (Book of Verse).
  • Oublier set. Une variable déclarée avec var se modifie avec set, par exemple set Score = Score + 1 ; sans set, le signe = n’est qu’une comparaison (Book of Verse).
  • Croire qu’un code qui compile est un code qui marche. Une boucle infinie peut compiler sans erreur, puis provoquer une erreur d’exécution, et une erreur d’exécution arrête tout le code Verse de l’île (Epic).
  • Déboguer à l’aveugle. Print écrit dans le journal et à l’écran ; les loggers Verse, eux, écrivent seulement dans le journal, avec un canal et un niveau de gravité, ce qui reste plus lisible.

Apprendre Verse avec l’IA : ce qui aide vraiment

Les assistants IA généralistes sont utiles pour expliquer une notion ou un message d’erreur. Pour écrire du Verse, ils ont une faiblesse : le langage est jeune, son API évolue, et ils inventent volontiers une fonction ou une signature qui n’existe pas. Vous ne le découvrez qu’en compilant.

La règle est donc simple : seul le compilateur fait foi. Demandez du code, compilez, lisez les diagnostics, et faites-vous expliquer chaque erreur plutôt que de la corriger à l’aveugle. C’est en lisant ces diagnostics que l’échec et les effets deviennent concrets.

C’est l’approche du Verse Coder d’Island Pilot : il écrit le code dans les vrais fichiers de votre projet, le compile via l’éditeur, corrige à partir des diagnostics réels renvoyés par UEFN, puis vous présente chaque modification à valider. En lisant ses changements, vous apprenez sur votre propre jeu. Le détail est sur la page Code Verse.

Questions fréquentes

Verse est-il difficile à apprendre ?

Les bases (variables, fonctions, conditions) sont accessibles. Ce qui demande un temps d’adaptation, ce sont les notions propres à Verse : contextes d’échec, effets et concurrence. Elles deviennent naturelles avec de petits projets.

Peut-on apprendre Verse sans avoir jamais programmé ?

Oui. Epic propose une série de leçons courtes destinée aux personnes sans aucune expérience de programmation, avec un exercice après chaque leçon.

Faut-il connaître Verse pour publier une île Fortnite ?

Non. Les devices de Fortnite Creative et d’UEFN suffisent pour de nombreux modes de jeu. Verse devient utile pour les mécaniques sur mesure : voir Comment créer un jeu Fortnite avec UEFN.

Quel éditeur utiliser pour écrire du Verse ?

Visual Studio Code : depuis le Verse Explorer d’UEFN, un double-clic sur un fichier .verse l’ouvre dans VS Code. La compilation se lance depuis le menu Verse de l’éditeur.

Verse sert-il en dehors de Fortnite ?

Aujourd’hui, Verse s’utilise dans UEFN. Epic a annoncé en juin 2026 qu’Unreal Engine 6 réunira Unreal Engine 5 et UEFN autour de Verse et du Scene Graph, avec un accès anticipé visé fin 2027.

Une IA peut-elle écrire du Verse à ma place ?

Oui, à condition de vérifier par la compilation : un code qui n’a pas été compilé n’est qu’une proposition. Le Verse Coder d’Island Pilot compile via l’éditeur et lit les vrais diagnostics avant de vous rendre la main.

Découvrir Island Pilot