{"id":203873,"date":"2021-11-09T13:22:19","date_gmt":"2021-11-09T12:22:19","guid":{"rendered":"https:\/\/blog.jetbrains.com\/dotnet\/2021\/11\/09\/wargaming-uses-rider-for-unreal-engine-to-develop-its-new-game\/"},"modified":"2021-11-19T12:03:56","modified_gmt":"2021-11-19T11:03:56","slug":"wargaming-utilise-rider-for-unreal-engine-pour-developper-son-nouveau-jeu","status":"publish","type":"dotnet","link":"https:\/\/blog.jetbrains.com\/fr\/dotnet\/2021\/11\/09\/wargaming-utilise-rider-for-unreal-engine-pour-developper-son-nouveau-jeu\/","title":{"rendered":"Wargaming utilise Rider for Unreal Engine pour d\u00e9velopper son nouveau jeu"},"content":{"rendered":"<p>Depuis un an et demi, nous proposons le programme d&#8217;acc\u00e8s anticip\u00e9 \u00e0 <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/lp\/rider-unreal\/\" target=\"_blank\" rel=\"noopener\">Rider for Unreal Engine<\/a>, notre nouvel IDE pour le d\u00e9veloppement de jeux en C++ avec Unreal Engine. Le programme a d\u00e9j\u00e0 attir\u00e9 des dizaines de milliers de d\u00e9veloppeurs ind\u00e9pendants, ainsi que de nombreux studios et entreprises de d\u00e9veloppement de jeux de toutes tailles. Nous \u00e9tions curieux de d\u00e9couvrir ce qui leur \u00e9tait le plus utile dans ce produit, ce qu&#8217;ils appr\u00e9ciaient le plus, et ce qui pouvait y manquer. Nous en avons pu en apprendre plus en \u00e9changeant avec Viacheslav Dubikovsk, Directeur technique chez Wargaming RED, un studio de d\u00e9veloppement de jeux r\u00e9cemment ouvert \u00e0 Moscou et faisant partie de Wargaming Group Limited. L&#8217;entretien a \u00e9t\u00e9 conduit par Anastasia Kazakova, Responsable Marketing Produit pour les outils .NET et C++, et Alexander Pirogov, Chef de Projet de Rider for Unreal Engine.<\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                                                            <div class=\"about-author__box-img\">\n                            <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/11\/speaker_photo.jpg\" alt=\"\" loading=\"lazy\">\n                        <\/div>\n                                        <div class=\"about-author__box-text\">\n                                                    <h4>Viacheslav Dubikovsky<\/h4>\n                                                <p>Technical Director at Wargaming RED<\/p>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/div>\n\n\n<p><strong><em>Bonjour Viacheslav\u00a0! Pouvez-vous nous parler du projet sur lequel vous travaillez actuellement ? De quel type de jeu s&#8217;agit-il ?<\/em><\/strong><\/p>\n<p>Nous n&#8217;avons pas encore annonc\u00e9 le titre du jeu, je ne peux donc pas vous en dire plus pour des raisons de confidentialit\u00e9. Ce que je peux dire c&#8217;est qu&#8217;il s&#8217;agit d&#8217;un jeu de tir de science-fiction, \u00e0 la troisi\u00e8me personne et en session.<\/p>\n<p><strong><em>Et vous utilisez Unreal comme moteur de jeu ?<\/em><\/strong><\/p>\n<p>Oui, c&#8217;est exact. Nous d\u00e9veloppons le jeu en C++ et nous utilisons Unreal Engine 4.26 pour le moment, mais nous sommes en train de migrer vers la version 4.27. Je ne pense pas que nous utiliserons Unreal Engine 5 pour ce projet car cette version a un rendu diff\u00e9rent et migrer pourrait avoir pour cons\u00e9quence de devoir refaire tous les graphismes d\u00e9j\u00e0 cr\u00e9\u00e9s.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/11\/wg.jpg\" alt=\"Equipe WG\" width=\"750\" \/><\/p>\n<p><strong><em>Comment le projet est-il organis\u00e9 ? Quelles technologies utilisez-vous ?<\/em><\/strong><\/p>\n<p>Comme je le disais, le projet est \u00e9crit en C++ et est d\u00e9velopp\u00e9 sur Unreal Engine. Nous utilisons beaucoup le m\u00e9canisme de r\u00e9flexion d&#8217;Unreal Engine, ainsi que la m\u00e9taprogrammation de mod\u00e8les en C++. Nous avons deux r\u00e9f\u00e9rentiels Mono, un pour le jeu lui-m\u00eame et un pour le moteur. La logique de jeu principale est stock\u00e9e dans le module partag\u00e9.<\/p>\n<p>Lorsqu&#8217;on utilise des \u00e9diteurs de code, le m\u00e9canisme de r\u00e9flexion de UE pr\u00e9sente g\u00e9n\u00e9ralement les plus grands d\u00e9fis. Il est difficile de travailler avec du code qui est entour\u00e9 de tant de d\u00e9finitions de macro qui, du point de vue du langage, n&#8217;ont pratiquement aucune signification. Tr\u00e8s peu de d\u00e9veloppeurs peuvent g\u00e9rer cela. C&#8217;est l\u00e0 que Rider for Unreal Engine nous sauve la vie !<\/p>\n<p><strong><em>Combien de d\u00e9veloppeurs sont impliqu\u00e9s dans le projet ? Quels sont les principaux outils qu&#8217;ils utilisent ? <\/em><\/strong><\/p>\n<p>Notre \u00e9quipe comprend environ 25 programmeurs. Un tiers d&#8217;entre eux utilisent Rider for Unreal Engine et les autres travaillent avec diff\u00e9rentes versions de Visual Studio. Avant d&#8217;utiliser Rider, nous utilisions Visual Studio, soit la version basique, soit en combinaison avec Visual Assist ou ReSharper C++. Mais avec ou sans plugins, l&#8217;\u00e9diteur VS rencontrait souvent des probl\u00e8mes de performance. Avec Visual Assist, les fonctionnalit\u00e9s du langage n&#8217;\u00e9taient pas assez pr\u00e9cises pour nous (bien que je pense que les choses doivent \u00eatre diff\u00e9rentes maintenant). Rider for Unreal Engine, en revanche, a fait preuve d&#8217;une excellente performance, du moins en ce qui concerne le traitement du code UE.<\/p>\n<p><strong><em>La migration vers Rider for Unreal Engine a-t-elle \u00e9t\u00e9 facile pour vous\u00a0? <\/em><\/strong><\/p>\n<p>Ma premi\u00e8re impression a \u00e9t\u00e9 : \u00ab\u00a0Waouh, \u00e7a prend en charge les raccourcis clavier de VS ! Toutes mes connaissances de VS vont m&#8217;\u00eatre utiles\u00a0\u00bb. En ce qui concerne l&#8217;interface utilisateur, celle de Visual Studio a l&#8217;air plus facile \u00e0 utiliser pour certains aspects, comme le d\u00e9bogage, s\u00fbrement parce que j&#8217;y suis plus habitu\u00e9. Mais je dois admettre que l&#8217;interface utilisateur de Rider est tr\u00e8s attractive visuellement.<\/p>\n<p>N\u00e9anmoins, il peut \u00eatre difficile de se d\u00e9faire d&#8217;un outil que l&#8217;on utilise depuis des ann\u00e9es, c&#8217;est pourquoi certains de nos coll\u00e8gues restent fid\u00e8les \u00e0 Visual Studio.<\/p>\n<p><strong><em>Quelles fonctionnalit\u00e9s de Rider for Unreal Engine vous ont \u00e9t\u00e9 les plus utiles dans votre projet jusqu&#8217;\u00e0 maintenant ?<\/em><\/strong><\/p>\n<p>Je dirais la navigation, trouver les utilisations, passer \u00e0 la d\u00e9claration de symbole, acc\u00e9der aux symboles d\u00e9riv\u00e9s et de base. Nous utilisons ces \u00e9l\u00e9ments tout le temps, \u00e0 la fois dans notre propre code et dans le code de Unreal Engine (car le code du moteur est la principale source de documentation pour les d\u00e9veloppeurs). L&#8217;un des points cl\u00e9s pour bien utiliser Unreal Engine est de pouvoir trouver rapidement les liens vers les champs et les fonctions et de naviguer dans le code, et Rider for Unreal Engine est particuli\u00e8rement efficace pour cela.<\/p>\n<p>Ensuite, il y a l&#8217;analyse du code statique, avec les inspections qui signalent les erreurs dans votre code. Quand vous pouvez voir les erreurs directement dans l&#8217;\u00e9diteur, avant m\u00eame de compiler, vous gagnez beaucoup de temps. Si ces erreurs arrivent jusqu&#8217;\u00e0 l&#8217;\u00e9tape de la compilation, cela peut g\u00e9n\u00e9rer des heures de \u00ab\u00a0ping-pong\u00a0\u00bb entre le compilateur et le d\u00e9veloppeur. Bien s\u00fbr, nous ne d\u00e9tectons pas toutes les erreurs de cette mani\u00e8re, en particulier dans les mod\u00e8les de code. Mais Unreal Engine n&#8217;utilise quasiment pas de mod\u00e8le, il ne reste donc qu&#8217;un faible pourcentage d&#8217;erreurs \u00e0 trouver et \u00e0 corriger. Les inspections qui sugg\u00e8rent l&#8217;ajout automatique de directives <code>include<\/code> manquantes aident \u00e9galement \u00e0 gagner du temps : gr\u00e2ce \u00e0 Rider, vous n&#8217;avez plus \u00e0 vous demander quels fichiers d&#8217;en-t\u00eate sont inclus et lesquels ne le sont pas.<\/p>\n<p>C&#8217;est qui est g\u00e9nial aussi avec Rider est sa connaissance du m\u00e9canisme de r\u00e9flexion impl\u00e9ment\u00e9 dans Unreal Engine et sa capacit\u00e9 \u00e0 compl\u00e9ter automatiquement les identificateurs de r\u00e9flexion et les macros. G\u00e9n\u00e9ralement, on ne de m\u00e9morise pas de telles informations, les conseils de Rider aident donc vraiment \u00e0 acc\u00e9l\u00e9rer le codage.<\/p>\n<p>Je dois \u00e9galement mentionner l&#8217;analyse des actifs et la liaison des Blueprints avec le code source C++. Cette fonctionnalit\u00e9 n&#8217;est pas la plus utilis\u00e9e, mais quand elle l&#8217;est, elle s&#8217;av\u00e8re tr\u00e8s utile. C&#8217;est particuli\u00e8rement le cas quand on refactorise et que quelque chose change dans le code source en C++ : il est alors tr\u00e8s utile de voir les utilisations dans les Blueprints. Idem avec les fichiers INI et les valeurs par d\u00e9faut des propri\u00e9t\u00e9s de classes : vous pouvez souvent voir les valeurs directement dans le code, sans avoir \u00e0 rechercher dans les fichiers INI.<\/p>\n<p>Le dernier \u00e9l\u00e9ment, et non des moindres, c&#8217;est l&#8217;int\u00e9gration avec Unreal Editor, c&#8217;est-\u00e0-dire les plugins RiderLink\/UnrealLink. G\u00e9n\u00e9ralement, nous lan\u00e7ons Unreal Editor depuis le d\u00e9bogueur Rider pour y programmer en direct. La possibilit\u00e9 de voir les journaux lorsque nous mettons en pause et reprenons le jeu, sans quitter Rider, peut parfois apporter une aide significative. Par exemple, si nous utilisons des plugins tiers (pour int\u00e9grer Steam ou des chats externes, cr\u00e9er le pipeline du jeu, etc.), nous n&#8217;avons m\u00eame pas \u00e0 basculer sur l&#8217;\u00e9diteur\u00a0: voir les journaux et mettre en pause\/reprendre l&#8217;\u00e9diteur est suffisant.<\/p>\n<p>D&#8217;ailleurs, j&#8217;ai quelques suggestions pour am\u00e9liorer le journal d&#8217;Unreal :<\/p>\n<ul>\n<li>Ajouter des options de filtrage suppl\u00e9mentaires. Il existe une multitude de journaux, parfois des centaines ou plus, il peut donc \u00eatre difficile de choisir les bonnes cat\u00e9gories.<\/li>\n<li>Mettre en \u00e9vidence plusieurs correspondances dans le journal en m\u00eame temps \u2013 il s&#8217;agit d&#8217;un cas d&#8217;utilisation vraiment courant.<\/li>\n<\/ul>\n<p><strong><em>Merci pour ces id\u00e9es ! Que pensez-vous du d\u00e9bogueur de Rider, l&#8217;utilisez-vous ?<\/em><\/strong><\/p>\n<p>Bien s\u00fbr. Aucun \u00e9diteur sans d\u00e9bogueur ne peut pr\u00e9tendre \u00eatre un v\u00e9ritable outil de d\u00e9veloppement ! Au d\u00e9but, nous avons rencontr\u00e9 quelques probl\u00e8mes avec le d\u00e9bogueur de Rider, qui ne s&#8217;arr\u00eatait pas aux points d&#8217;arr\u00eat, mais il semble que cela a \u00e9t\u00e9 corrig\u00e9. La fonction de d\u00e9bogage que nous utilisons le plus est d\u00e9finitivement le code pas \u00e0 pas. Parfois, nous utilisons des points d&#8217;arr\u00eats conditionnels. Et nous appr\u00e9cions la mani\u00e8re dont le d\u00e9bogueur affiche les contenus des objets Unreal Engine.<\/p>\n<p><strong><em>Vous d\u00e9boguez principalement sur le bureau ?<\/em><\/strong><\/p>\n<p>Pour l&#8217;instant, oui. Nous envisageons de travailler avec des consoles \u00e0 l&#8217;avenir, mais nous ne sommes pas encore pr\u00eats.<\/p>\n<p><strong><em>Remarque\u00a0: malheureusement, Rider ne permet pas le d\u00e9bogage sur console pour le moment. Nous sommes en discussion avec les principaux fabricants de consoles \u00e0 ce sujet. Ces processus peuvent prendre beaucoup de temps, avec parfois des obstacles administratifs.<\/em><\/strong><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/11\/wg_black.jpg\" alt=\"WG brand\" width=\"750\" \/><\/p>\n<p><strong><em>Nous voulions aussi parler des syst\u00e8mes de contr\u00f4les de versions. Lesquels utilisez-vous ?<\/em><\/strong><\/p>\n<p>Nous utilisons principalement Git, avec de nouvelles fonctionnalit\u00e9s d\u00e9velopp\u00e9es activement en branches. Nous utilisons l&#8217;int\u00e9gration de Git avec Rider. Pour le rebasage, cependant, nous utilisons le client Tortoise, car il nous permet d&#8217;avoir une meilleure vue d&#8217;ensemble. Le rebasage est s\u00fbrement l&#8217;op\u00e9ration de Git la plus complexe. Nous avons essay\u00e9 de l&#8217;automatiser et de la rendre plus facile \u00e0 utiliser, mais nous n&#8217;y sommes pas arriv\u00e9s pour le moment.<\/p>\n<p>Dans certains de mes autres projets, j&#8217;ai aussi travaill\u00e9 avec Perforce et PlasticSCM.<\/p>\n<p><strong><em>Profilez-vous votre code ? Si c&#8217;est le cas, utilisez-vous des outils de profilage tiers ?<\/em><\/strong><\/p>\n<p>Oui, nous analysons notre code avec <a href=\"https:\/\/docs.unrealengine.com\/4.26\/en-US\/TestingAndOptimization\/PerformanceAndProfiling\/UnrealInsights\/\" target=\"_blank\" rel=\"noopener\">Unreal Insights<\/a>. Lorsqu&#8217;il s&#8217;agit de recueillir des informations de profilage, l&#8217;outil natif d&#8217;Unreal Engine est difficile \u00e0 battre. Mais en mati\u00e8re de visualisation, des am\u00e9liorations sont certainement possibles. Nous utilisons notre propre outil pour tracer des graphiques d&#8217;utilisation de CPU. Unreal Insight est bien pour inspecter les contenus des frames, mais il n&#8217;aide pas \u00e0 voir toutes les dynamiques, c&#8217;est pourquoi nous avons d\u00e9cid\u00e9 de concevoir notre propre outil.<\/p>\n<p><strong><em>Merci de nous avoir consacr\u00e9 du temps pour cet entretien, Viacheslav ! Bonne chance pour votre projet de jeu !<\/em><\/strong><\/p>\n<p><strong><em>Nous avons h\u00e2te de recevoir vos id\u00e9es d&#8217;am\u00e9liorations pour Rider for Unreal Engine.<\/em><\/strong><\/p>\n\n\n<p><em>Auteur de l&#8217;article original en anglais :<\/em><\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":813,"featured_media":200724,"comment_status":"closed","ping_status":"closed","template":"","categories":[15,89],"tags":[23,2095,6809],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/dotnet\/203873"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/dotnet"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/dotnet"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=203873"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/dotnet\/203873\/revisions"}],"predecessor-version":[{"id":203887,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/dotnet\/203873\/revisions\/203887"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/200724"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=203873"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=203873"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=203873"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=203873"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}