JetBrains Rider - Maintenant pour Unreal Engine

Salut Habr!

La semaine dernière, après les sorties de la version 2020.1, un autre événement majeur s'est produit pour tous nos produits de bureau: nous avons ouvert l'accès public à la version d'essai de Rider pour Unreal Engine . Pour le moment, il s'agit d'un produit distinct, une version de notre environnement de développement pour Rider, mais avec la prise en charge de C ++ et Unreal Engine. Alors arrête! Environnement de développement C ++. Un de plus?! Disons le trier dans l'ordre.

Pilote pour moteur irréel



Commençons par une petite histoire. Il y a quelques années, nous avons réuni tous ceux qui fabriquent des outils C ++ chez JetBrains pour discuter de la difficulté pour les utilisateurs de naviguer dans la variété de nos offres. Après tout, il y a CLion, ReSharper C ++ et la prise en charge de C ++ dans AppCode. Après plusieurs heures de discussion, nous sommes parvenus aux conclusions suivantes:

  • Bien que l'outil universel semble attrayant, avec l'expansion du ciblage, l'augmentation du nombre d'outils tiers intégrés, les cas d'utilisation pris en charge, il devient très difficile de trouver un équilibre entre commodité, interface intuitive et nombreuses fonctionnalités.
  • Le monde du développement logiciel n'a depuis longtemps pas de frontières claires dans les langages de développement. De nombreux projets sont multilingues. Plus important est l'étendue des logiciels et des technologies qui y sont utilisés.

En conséquence, nous avons décidé d'unifier l'expérience utilisateur dans nos outils pour C ++, mais nous avons convenu que l'approche pour créer différents outils (bien qu'avec un noyau commun ou sur une plate-forme commune) pour différents domaines de développement logiciel est la bonne. En pratique, cela ressemble à ceci:

  • CLion — C C++. , , , AI, , . , , ( CMake, Gradle Native, compilation database, Bazel, Makefiles) . , , CLion msbuild, , .
  • ReSharper C++ — , Windows, , Visual Studio. C++ C#. Visual Studio, ReSharper, C++.
  • AppCode — , iOS/macOS. C/C++ mac- .

Alors, qu'est-ce que le Rider a à voir avec ça? Quel est l'environnement de développement multiplateforme pour .NET lié au C ++? En pratique, environ 30% des utilisateurs de Rider sont des studios de jeux et des sociétés de développement de jeux. C'est compréhensible, car Rider est largement populaire précisément en tant qu'environnement de développement pour Unity . Ce n'est pas la première année que l'équipe Rider personnalise un instrument spécialement pour ce moteur de jeu. Le résultat est apprécié non seulement par les programmeurs Unity, mais aussi par Unity Technologies eux-mêmes, avec lesquels nous avons longtemps et fructueusement interagi en termes de technologie elle-même.

En ce qui concerne beaucoup de nos utilisateurs dans le domaine du développement de jeux, nous avons remarqué que de nombreux studios n'ont pas de séparation claire - créez des jeux uniquement sur Unity ou uniquement sur Unreal Engine. Aujourd'hui, ils jouent sur une technologie, et demain sur une autre, ou une équipe utilise le moteur Unreal, et l'autre Unity, ou même son propre moteur personnalisé. Il est clair que les développeurs et les entreprises en général n'aiment vraiment pas "sauter" entre différents environnements de développement. Et ici, nous avons décidé que si nous pouvions faire de Rider un succès pour Unity, nous pourrions aller plus loin et le faire en général avec succès pour le monde du développement de jeux. L'idée de Rider est donc née comme un environnement de développement universel pour Game Dev .

En quoi consiste Rider for Unreal Engine


Le développement ultérieur des événements est assez évident pour ceux qui connaissent la technologie sur laquelle le Rider est construit. Rider se compose d'une partie front-end basée sur la plateforme IntelliJ et d'une partie back-end basée sur ReSharper. Tout le support linguistique fonctionne sur le back-end. Par conséquent, nous venons de connecter le support C ++ et Unreal Engine existant dans ReSharper C ++ à Rider en utilisant la même technologie. Du spécifique, j'ai dû mettre en œuvre en plus:

  • Plugin pour sélectionner Rider comme environnement de développement dans Unreal Editor ( Rider Source Code Access ) pour les versions de moteur 4.22-4.24. À partir de la version 4.25, cette fonctionnalité sera déjà incluse dans le moteur UE lui-même.
  • Les plugins UnrealLink pour Rider et RiderLink pour Unreal Editor, qui assurent l'intégration avec Blueprints dans Rider et sont généralement responsables de la communication entre Rider et Unreal Editor.
  • Débogueur

Il convient de noter que l'aperçu de Rider for Unreal Engine n'est désormais disponible que sous Windows, ouvre les fichiers .sln et s'appuie sur la génération par le compilateur de Microsoft. À l'avenir, au moment de la publication, nous essaierons d'étendre aux trois plates-formes et de mettre en œuvre la prise en charge de .uproject comme modèle de conception principal.

Débogueur basé sur LLDB


Une partie importante du développement de jeux se déroule actuellement sur la plate-forme Windows et dans le cadre de la chaîne d'outils Microsoft. Si nous regardons quels outils de débogage existent pour le code compilé à l'aide du compilateur Microsoft Visual C ++, nous verrons:

  1. Microsoft utilise des outils de débogage basés sur vsdebugeng.dll dans ses propres outils . La licence ne permet pas l'utilisation de ces outils dans des environnements de développement tiers.
  2. CDB WinDbg dbgeng.dll. MS . (.pdb), , , .
  3. Il y a également eu des développements dans la communauté LLVM pour le débogage de la prise en charge de la chaîne d'outils Visual Studio à l'aide de LLDB. Nous les avons utilisés et à peine un an et demi a écrit la première version d'un débogueur fonctionnant généralement. Il inclut un support initial et encore brut pour le format NatVis (telles que les jolies imprimantes spécifiques à MS). Dans le même temps, Rider for Unreal Engine trouve maintenant NatVis dans le projet sur Unreal Engine et les charge dans le débogueur. Nous utilisons maintenant le même débogueur dans CLion pour la chaîne d'outils Visual Studio (il est activé par défaut dans ce cas à partir de la version 2020.1).

Le nouveau débogueur est encore humide, bien sûr, il a encore des problèmes et des ralentissements importants. Mais nous espérons y penser pour publication.

Prise en charge C ++


Je le répète - toutes les fonctionnalités de prise en charge linguistique de ReSharper C ++ sont désormais disponibles dans l'aperçu du moteur pour Rider for Unreal. Il comprend:

  • Environ 170 inspections de code différentes et plus de 50 correctifs rapides.
  • Refactors qui prennent en compte toutes les utilisations contextuelles d'un symbole (renommer, changer la signature de la méthode, supprimer la méthode, ajouter un champ / variable / typedef, remplacer (Inline) une variable ou typedef et autres).
  • Génération de code (méthodes getters / setters, constructeurs, opérateurs de comparaison, modèles de documentation de code).
  • Actions pour aider à écrire du code, navigation, formatage et prise en charge des styles de dénomination, #includedirectives de tri .

Générer une action

Prise en charge des dialectes HLSL, C #, uproject / uplugin


Cette année, nous avons commencé à travailler sur la prise en charge du langage pour l'écriture de shaders HLSL dans ReSharper C ++ , et il est immédiatement entré dans l'aperçu initial de Rider pour Unreal Engine. La prise en charge comprend la mise en évidence de la syntaxe, des info-bulles avec documentation, des info-bulles pour les noms et types de paramètres, les actions de navigation, la saisie semi-automatique, la prise en charge des chemins de fichiers virtuels et même la refactorisation.

Étant donné que Rider pour Unreal Engine est basé sur l'environnement de développement pour .NET, la prise en charge des langues fonctionne dans les fichiers Build.cs et Target.cs.

Et enfin, en ce qui concerne la prise en charge des dialectes linguistiques, Rider for Unreal Engine comprend les dialectes des fichiers .uproject / .uplugin, offrant des options de saisie automatique et des outils de documentation.

dialecte de projet

Intégration de Blueprints


Les fichiers Blueprints sont des données binaires qui sont généralement modifiées dans un éditeur visuel à l'intérieur de l'éditeur Unreal. Les objets de ces fichiers sont hérités des classes en C ++; ils redéfinissent les propriétés de la partie C ++ du jeu. Et ici, Rider for Unreal Engine est cet environnement de développement unique qui lit tous les fichiers Blueprints nécessaires et affiche ces liens dans l'éditeur de code C ++:

Classes dérivées BP

Si vous modifiez, par exemple, la valeur de la propriété dans l'éditeur Unreal Engine et enregistrez l'actif, la valeur ici il sera également mis à jour automatiquement dans Rider (nous avons des observateurs suspendus pour modifier les fichiers d'actif):

Propriétés BP

Sans enregistrer les fichiers, nous espérons que cela fonctionnera bientôt aussi (la préparation de cela est maintenant en cours dans le plugin UnrealLink).

L'appel Find usages inclut non seulement les utilisations dans le code C ++, mais également les fichiers Blueprints. Un double-clic sur ces utilisations ouvre l'éditeur Unreal.

Comprendre le mécanisme de réflexion de UE4


La réflexion dans Unreal Engine est implémentée à l'aide de macros spéciales (UCLASS, UFUNCTION, UPROPERTY, etc.). Rider sait que les paramètres de ces macros ne sont pas uniquement du texte. L'analyseur C ++ dans ReSharper C ++ et Rider peut vraiment «comprendre» la signification de ces macros sans même lancer l'outil Unreal Header Build (c'est-à-dire avant que le contenu des fichiers .generated.h soit réellement généré ).

Soit dit en passant, en parlant des fichiers .generated.h , ReSharper C ++ et Rider savent que les directives #include manquantes ajoutées automatiquement doivent être insérées strictement avant de connecter les fichiers .generated.h . Et prenez également en compte ces fichiers générés lors du renommage du refactoring.

Pour en revenir au mécanisme de réflexion, il convient de dire que les spécificateurs de réflexion ne sont pas uniquement du texte dans ReSharper C ++ et Rider. Il existe des conseils de saisie semi-automatique et de documentation pour eux: des

Doc de réflexion

conseils de documentation sont également disponibles pour les macros de réflexion elles-mêmes.

Et l'analyseur de code vérifie l'utilisation des macros de réflexion et indique les erreurs associées à cela. Par exemple:

  • Les classes UCLASS doivent être héritées publiquement d'UObject ou de l'une de ses classes descendantes. De plus, un tel parent doit être exactement un.
  • Les spécificateurs UCLASS doivent être utilisés pour les classes, USTRUCT pour les structures.
  • Les classes UE4 ne peuvent pas être déclarées dans d'autres classes.
  • Les objets stockés dans des champs non marqués UPROPERTY peuvent être collectés à tout moment par le garbage collector.

Prise en charge des appels de procédure à distance (RPC) pour les actions de navigation et de génération de code


Si nous considérons les appels de procédures distantes du point de vue d'un analyseur C ++ normal, vous remarquerez assez rapidement l'ignorance de l'analyseur que plusieurs fonctions avec des noms différents (par exemple, suffixes _Validateet _Implementation) peuvent correspondre à une déclaration de fonction . Dans ReSharper C ++ / Rider, nous avons formé un analyseur pour identifier RPC sur spécificateurs Client, Serveret NetMulticastdans les paramètres macro UFUNCTION. Ainsi:

  • La navigation offre toutes les options nécessaires à la mise en œuvre de la fonction.
  • La génération de code peut créer des fonctions avec des suffixes _Validateet _Implementationou seulement celles qui manquent:
    Génération RPC
  • Les remaniements de code Renommer et modifier la signature mettront à jour toutes les fonctions nécessaires et conserveront ainsi votre code dans le bon état.

Connaissance des règles de dénomination d'Unreal Engine 4


ReSharper C ++ et Rider connaissent les règles de dénomination officielles du code Unreal Engine. Ces règles sont utilisées par l'environnement de développement dans toutes les actions pour travailler avec du code, telles que la génération de getters et de setters ou la refactorisation d'une variable (Introduce Variable). Et surtout, il existe une vérification du code d' inspection de nommage UE4 incohérente et une solution rapide correspondante qui entraînera le renommage de la refactorisation et le changement de nom de toutes les utilisations du nom qui ne sont pas conformes aux règles.

Performance de l'éditeur


Nous prenons en charge le développement d'Unreal Engine dans ReSharper C ++ depuis un certain temps et, bien sûr, nous voyons que les performances de l'éditeur sont la principale plainte. En raison de son architecture, Rider est exempt de nombreux problèmes de performances qui sont présents dans ReSharper (ils sont en partie dus aux limitations de studio sur les processus 32 bits, dans lesquels ReSharper fonctionne, mais pas seulement).

De plus, nous optimisons spécifiquement l'IDE pour améliorer les performances sur le moteur Unreal. Nous indexons d'abord le code du jeu utilisateur, en incluant instantanément toutes les actions astucieuses de l'éditeur sur le code utilisateur. Et l'indexation du code moteur lui-même se produit après cela en arrière-plan. Il existe plusieurs options supplémentaires pour gérer l'indexation:

Options de performance

En conséquence, ceux qui ont déjà commencé à utiliser Rider pour Unreal Engine réagissent très positivement aux performances de l'éditeur! Et nous sommes sûrs que nous pouvons faire encore mieux.

Démo vidéo et encore une fois sur la façon d'accéder


Ces fonctionnalités et bien d'autres peuvent être vues en action dans une vidéo de démonstration (en anglais) de notre avocat développeur:


Et pour essayer ces fonctionnalités vous-même, il vous suffit de remplir un simple formulaire et de recevoir une lettre de notre part contenant un lien vers la création et l'activation d'une licence gratuite pour une prévisualisation anticipée. Allez, remplissez , essayez, écrivez des critiques! Pour vos commentaires, comme d'habitude, il y a des commentaires ici, un tracker ( ReSharper C ++ et Rider ) et notre courrier d'assistance ( rider-cpp-support@jetbrains.com ).

Merci pour l'attention!

Rider l'équipe
Drive to Develop

All Articles