• English
  • Français
  • Jeux de François Hautier

    Développement de OEngine (de juillet 2020 à février 2021)


    Suite de Développement de OEngine (de juin 2019 à juin 2020), cet article porte sur la période de juillet 2020 à février 2021, correspondant à la première moitié du développement des Schtroumpfs – Mission Malfeuille.



    Évoqué à plusieurs reprises au travers de cet article, ce que nous appelons « Entité » dans OEngine est un type d’objet basé sur le pattern Entity component system. Chaque élément du jeu (joueur, PNJ, décor, mécanisme) est une entité. Introduites par Passtech Games, elles surclassent les historiques GameObjects, en offrant la possibilité d’être facilement composables, héritables, « spawnables »…

    Bots Discord

    Dans le but d’améliorer le confort des utilisateurs de l’éditeur de OEngine, il était impératif de corriger sa stabilité. Lors de la production d’Astérix & Obélix XXL 3, il était extrêmement fréquent que l’éditeur plante plusieurs fois par jour chez la plupart des utilisateurs (level artistes, level designer…), à tel point que cela était devenu une habitude pour eux et qu’ils s’en accommodaient, tant qu’il était possible de trouver un moyen de contourner le problème et de continuer à travailler. À l’exception de plantages bloquants, l’équipe de développement du moteur n’était même plus au courant des problèmes rencontrés, qui pesaient sur le moral des utilisateurs et ralentissaient le déroulement de la production.

    Pour remédier à cela, une idée m’est venue en tête, partant d’une plaisanterie : créer un bot Discord (qui est notre outil de communication interne à OSome Studio). Son rôle : publier sur un salon les messages d’erreurs rencontrés par les utilisateurs de OEngine en cas de plantage ou d’avertissement, avec le nom de l’utilisateur, le numéro de la build de l’éditeur, la callstack… Grâce à cela, nous – programmeurs – étions désormais avertis immédiatement quand un utilisateur plantait, et pouvions réagir en conséquence pour résoudre le problème ! C’était d’ailleurs très amusant (peut être un peu étrange aussi) d’appeler les utilisateurs quasi instantanément après leur plantage pour mieux comprendre dans quelle circonstances cela avait pu se produire.

    Parler de ce bot est une bonne occasion de rappeler que la chasse aux bugs représente un temps considérable, mais nécessaire, pour moi comme pour mes camarades programmeurs, mais qu’il est difficile de décrire et de rendre intéressant ces différentes corrections. Toutefois, comme je l’évoquais dans ce précédent article, elles sont l’occasion de découvrir des parties du code que je n’aurais pas forcément eu l’occasion de visiter ou de modifier en d’autres circonstances.

    Un autre bot Discord fut créé ultérieurement, avec pour mission d’envoyer les notes de mise à jour de la dernière build de l’éditeur construite par Jenkins aux utilisateurs.

    Multi-vue

    Il est désormais possible de travailler avec plusieurs vues dans l’éditeur ! Cette nouveauté fait suite à mes travaux d’amélioration de l’ergonomie de la vue 3D (décrits dans cet article). Beaucoup de refactorisation de code fut nécessaire pour parvenir à ce résultat : tout le code qui avait été conçu pour la vue principale est maintenant pensé pour fonctionner avec un nombre illimité de vues (déplacement de la caméra, manipulateur de vue, dessin de la grille, etc).

    De plus, il est possible de créer un GameObject de caméra depuis une vue, et d’ouvrir une vue depuis un GameObject de caméra. Cela permet par exemple de conserver un point de vue particulier dans un niveau. Ce point de vue peut aussi être ajusté facilement, en déplaçant la position et la cible de la caméra directement avec les manipulateurs.

    Cette fonctionnalité fut notamment utilisée par les levels designers, qui au cours de la production des Schtroumpfs, travaillaient l’architecture des niveaux avec de multiples vues ouvertes, leur permettant de surveiller à quoi ressemblait le niveau sous tous les angles, à chaque déplacement d’objets.

    Flags

    La notion de flags n’est pas nouvelle dans OEngine, ils sont par exemple utilisés pour la physique, entre autres. J’ai néanmoins été chargé d’étendre leur usage aux objets de la scène en général, comme les entités ou la height map, et d’améliorer leur confort d’utilisation :

    • Les utilisateurs peuvent maintenant créer et éditer les flags depuis l’éditeur, ce qui auparavant était une tâche assignée aux programmeurs.
    • Les flags sont utilisables avec les entités, et celles-ci héritent des flags de leurs entités parentes.
    • Les objets de la scène regroupés par flags peuvent être masqués au besoin, indépendamment de la vue.
    • Il est également possible de masquer les objets regroupés par flags en jeu sur console, pour, par exemple, cerner plus facilement quels objets diminuent les performances.
    • De même, nous pouvons empêcher l’apparition de certaines entités via leurs flags en fonction de la plateforme, pour améliorer les performances (enlever les petites fleurs au sol sur Switch, …).

    Prefabs

    Dans OEngine, ce que nous nommons « prefabs » est un type de GameObject qui ajoute dans la scène les GameObject tels qu’ils sont disposés dans le level pointé par ce prefab. Une sorte de GameObject qui en regroupe d’autres. Cette notion avait été remise au goût du jour par Alban Guéret de Passtech Games, qui avait créé le composant d’entité de type prefab, lors du développement de Curse of the Dead Gods. Ce composant était alors spécifique à ce projet.

    Pour les besoins de notre propre production, j’ai rendu ce composant générique, pour qu’il puisse être utilisé par tous les projets, dont le nôtre. J’y ai ensuite apporté quelques corrections : il est maintenant possible de sélectionner le prefab dans la scène, de le cacher, et de le redimensionner de manière uniforme. En bonus, j’ai corrigé la fonction de construction d’un quaternion à partir d’une matrice, qui construisait une rotation cassée avec une matrice non normalisée…

    Un assortiment d’outils et d’améliorations

    Pour faire gagner du temps au level artist lors de leur habillage des niveaux, j’ai ajouté un bouton magique à la HeightMap, pour la sculpter automatiquement par rapport aux objets présents dans la scène.

    Pour une meilleure compréhension, le message de fermeture des documents ouverts dans l’éditeur a été modifié, pour qu’il soit conforme aux autres logiciels. C’est bête, mais c’est le type de détail qui peut faire perdre du temps.

    Ajout d’un affichage de la « règle des tiers », et d’un outil pour mesurer facilement la distance d’un point sous la souris. Ces outils fonctionnent peu importe la vue.

    Il est dorénavant possible de créer des entités « à la volée » sous la souris, parmi les modèles d’entités disponibles dans la scène.

    Ajout d’un bouton qui permet de sélectionner les entités qui héritent de la même entité que celle qui nous intéresse.

    Les menus peuvent maintenant afficher plusieurs sous-menus, et pas juste un seul comme c’était le cas auparavant.

    Lors de la recherche d’un élément dans un menu (comme celui-ci dessus), les catégories vident ne restent plus visibles.

    Amélioration de l’ordre des éléments dans la fenêtre de hiérarchie : les dossiers apparaissent en premier, suivis des objets.

    Ajout de la notion d’angle solide pour les occluders, pour pouvoir exclure du rendu certains occluders, s’il sont trop petits. On peut aussi maintenant définir un nombre maximum d’occluders. J’ai également mis en place un debug visuel des occluders, pour comprendre comment ils interagissent entre eux et corriger leur comportement si nécessaire (par exemple, un occluder peut en occluder un autre).

    Amélioration du contrôle de la « caméra libre » disponible dans le moteur, utilisé par le service marketing pour réaliser des screenshots, ou par nous autres développeurs, à des fins de debug.

    Élaboration d’un outil qui vérifie qu’il ne manque aucun doublage audio pour chaque langue disponible dans le jeu.

    Export de la liste des objets rendus durant une frame dans un fichier csv, avec leur nombre de triangles, leur distance par rapport à la caméra et leur volume, pour aider à l’optimisation du jeu.