JetBrains Rider - Jetzt für Unreal Engine

Hallo Habr!

Letzte Woche, nach der Veröffentlichung von Version 2020.1, ereignete sich für alle unsere Desktop-Produkte ein weiteres wichtiges Ereignis: Wir haben den öffentlichen Zugriff auf die Testversion von Rider for Unreal Engine eröffnet . Im Moment ist dies ein separates Produkt, eine Version unserer Entwicklungsumgebung für Rider, jedoch mit Unterstützung für C ++ und Unreal Engine. Also hör auf! C ++ - Entwicklungsumgebung. Noch eine?! Lassen Sie es uns in der richtigen Reihenfolge sortieren.

Fahrer für unwirklichen Motor



Beginnen wir mit einer kleinen Geschichte. Vor einigen Jahren haben wir alle, die C ++ - Tools bei JetBrains herstellen, zusammengebracht, um zu diskutieren, wie schwierig es für Benutzer ist, durch die Vielfalt unserer Angebote zu navigieren. Immerhin gibt es CLion, ReSharper C ++ und Unterstützung für C ++ in AppCode. Nach mehrstündiger Diskussion kamen wir zu folgenden Schlussfolgerungen:

  • Obwohl das universelle Tool attraktiv aussieht, wird es mit der Ausweitung des Targetings, der Zunahme der Anzahl integrierter Tools von Drittanbietern und unterstützten Anwendungsfällen sehr schwierig, ein Gleichgewicht zwischen Komfort, intuitiver Benutzeroberfläche und vielen Funktionen zu finden.
  • Die Welt der Softwareentwicklung hat in Entwicklungssprachen lange keine klaren Grenzen mehr. Viele Projekte sind mehrsprachig. Wichtiger ist der Umfang der darin verwendeten Software und Technologien.

Aus diesem Grund haben wir beschlossen, die Benutzererfahrung in unseren Tools für C ++ zu vereinheitlichen, waren uns jedoch einig, dass der Ansatz, verschiedene Tools (wenn auch mit einem gemeinsamen Kernel oder auf einer gemeinsamen Plattform) für verschiedene Bereiche der Softwareentwicklung zu erstellen, der richtige ist. In der Praxis sieht es so aus:

  • 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- .

Was hat der Fahrer damit zu tun? Was ist die plattformübergreifende Entwicklungsumgebung für .NET in Bezug auf C ++? In der Praxis sind etwa 30% der Rider-Benutzer Spielestudios und Spieleentwicklungsunternehmen. Es ist verständlich, weil Rider gerade als Entwicklungsumgebung für Unity weitgehend beliebt ist . Dies ist nicht das erste Jahr, in dem das Rider-Team ein Instrument speziell für diese Spiel-Engine anpasst. Das Ergebnis wird nicht nur von Unity-Programmierern, sondern auch von Unity Technologies selbst geschätzt, mit denen wir in Bezug auf die Technologie selbst lange und fruchtbar zusammengearbeitet haben.

Bei vielen unserer Benutzer im Bereich der Spieleentwicklung haben wir festgestellt, dass viele Studios keine klare Trennung haben - machen Sie Spiele nur auf Unity oder nur auf Unreal Engine. Heute spielen sie auf einer Technologie und morgen auf einer anderen, oder ein Team verwendet die Unreal Engine und die andere Unity oder sogar eine eigene benutzerdefinierte Engine. Es ist klar, dass Entwickler und Unternehmen im Allgemeinen nicht gerne zwischen verschiedenen Entwicklungsumgebungen wechseln. Und hier haben wir beschlossen, dass wir, wenn wir Rider für Unity erfolgreich machen könnten, noch weiter gehen und es allgemein für die Welt der Spieleentwicklung erfolgreich machen können. So wurde die Idee von Rider als universelle Entwicklungsumgebung für Game Dev geboren .

Woraus Rider for Unreal Engine besteht


Die Weiterentwicklung von Veranstaltungen ist für diejenigen, die mit der Technologie, auf der der Fahrer basiert, vertraut sind, offensichtlich. Rider besteht aus einem Front-End-Teil, der auf der IntelliJ-Plattform basiert, und einem Back-End-Teil, das auf ReSharper basiert. Die gesamte Sprachunterstützung funktioniert im Backend. Aus diesem Grund haben wir gerade die vorhandene C ++ - und Unreal Engine-Unterstützung in ReSharper C ++ mit derselben Technologie mit Rider verbunden. Von der spezifischen musste ich zusätzlich implementieren:

  • Plugin zur Auswahl von Rider als Entwicklungsumgebung im Unreal Editor ( Rider Source Code Access ) für die Engine-Versionen 4.22-4.24. Ab Version 4.25 ist diese Funktionalität bereits in der UE-Engine selbst enthalten.
  • UnrealLink- Plugins für Rider und RiderLink für Unreal Editor, die die Integration mit Blueprints in Rider ermöglichen und im Allgemeinen für die Kommunikation zwischen Rider und Unreal Editor verantwortlich sind.
  • Debugger

Es ist erwähnenswert, dass die Vorschau von Rider for Unreal Engine jetzt nur unter Windows verfügbar ist, SLN- Dateien öffnet und auf dem Build des Compilers von Microsoft basiert . In Zukunft werden wir zum Zeitpunkt der Veröffentlichung versuchen, auf alle drei Plattformen zu expandieren und die Unterstützung für .uproject als Hauptdesignmodell zu implementieren .

LLDB-basierter Debugger


Ein wesentlicher Teil der Spieleentwicklung findet derzeit auf der Windows-Plattform und als Teil der Microsoft-Toolchain statt. Wenn wir uns ansehen, welche Debugging-Tools für Code vorhanden sind, der mit dem Microsoft Visual C ++ - Compiler kompiliert wurde, werden wir Folgendes sehen:

  1. Microsoft verwendet Debugging-Tools basierend auf vsdebugeng.dll in seinen eigenen Tools . Die Lizenz erlaubt nicht die Verwendung dieser Tools in Entwicklungsumgebungen von Drittanbietern.
  2. CDB WinDbg dbgeng.dll. MS . (.pdb), , , .
  3. Es gab auch Entwicklungen in der LLVM-Community für das Debuggen der Unterstützung für die Visual Studio-Toolchain mithilfe von LLDB. Wir haben sie verwendet und nur anderthalb Jahre lang die erste Version eines allgemein funktionierenden Debuggers geschrieben. Es enthält anfängliche und noch rohe Unterstützung für das NatVis-Format (solche MS-spezifischen hübschen Drucker). Gleichzeitig findet Rider for Unreal Engine NatVis jetzt im Projekt auf Unreal Engine und lädt sie in den Debugger. Wir verwenden jetzt denselben Debugger in CLion für die Visual Studio-Toolchain (in diesem Fall ist er ab Version 2020.1 standardmäßig aktiviert).

Der neue Debugger ist immer noch feucht, natürlich hat er immer noch erhebliche Probleme und Verlangsamungen. Wir hoffen jedoch, dass wir uns an die Veröffentlichung erinnern können.

C ++ Unterstützung


Ich wiederhole: Alle Sprachunterstützungsfunktionen von ReSharper C ++ sind jetzt in der Rider for Unreal Engine-Vorschau verfügbar. Es enthält:

  • Über 170 verschiedene Code-Inspektionen und über 50 Schnellkorrekturen.
  • Refaktoren, die alle kontextbezogenen Verwendungen eines Symbols berücksichtigen (Umbenennen, Ändern der Methodensignatur, Entfernen von Methoden, Hinzufügen eines Felds / einer Variablen / eines Typedef, Ersetzen (Inline) einer Variablen oder eines Typedef usw.).
  • Codegenerierung (Getter / Setter-Methoden, Konstruktoren, Vergleichsoperatoren, Codedokumentationsvorlagen).
  • Aktionen zum Schreiben von Code, Navigation, Formatierung und Unterstützung für Namensstile und Sortieranweisungen #include.

Aktion generieren

Unterstützung für HLSL-, C # -, Uproject / Uplugin-Dialekte


In diesem Jahr haben wir begonnen, an der Sprachunterstützung für das Schreiben von HLSL-Shadern in ReSharper C ++ zu arbeiten , und es wurde sofort in die frühe Vorschau von Rider for Unreal Engine aufgenommen. Die Unterstützung umfasst Syntaxhervorhebung, QuickInfos mit Dokumentation, QuickInfos für Parameternamen und -typen, Navigationsaktionen, automatische Vervollständigung, Unterstützung für virtuelle Dateipfade und sogar Refactoring.

Da Rider for Unreal Engine auf der Entwicklungsumgebung für .NET basiert, funktioniert die Sprachunterstützung sowohl in Build.cs- als auch in Target.cs-Dateien.

Wenn es um die Unterstützung von Sprachdialekten geht, versteht Rider for Unreal Engine die Dialekte von .uproject / .uplugin-Dateien und bietet Optionen für Tools zur automatischen Vervollständigung und Dokumentation.

Projektdialekt

Blaupausen Integration


Blueprints-Dateien sind Binärdaten, die normalerweise in einem visuellen Editor im Unreal Editor bearbeitet werden. Die Objekte in diesen Dateien werden von Klassen in C ++ geerbt und definieren die Eigenschaften aus dem C ++ - Teil des Spiels neu. Und hier ist Rider for Unreal Engine diese einzigartige Entwicklungsumgebung, die alle erforderlichen Blueprints-Dateien ausliest und diese Links im C ++ - Code-Editor anzeigt:

Von BP abgeleitete Klassen

Wenn Sie beispielsweise den Wert der Eigenschaft im Unreal Engine-Editor ändern und das Asset speichern, dann den Wert hier Es wird auch automatisch in Rider aktualisiert (wir haben Beobachter zum Ändern von Asset-Dateien aufgehängt):

BP-Eigenschaften

Ohne das Speichern der Dateien hoffen wir, dass dies auch bald funktioniert (die Vorbereitung dafür erfolgt jetzt im UnrealLink-Plugin).

Der Aufruf "Verwendungen suchen" enthält nicht nur Verwendungen in C ++ - Code, sondern auch Blueprints-Dateien. Ein Doppelklick auf solche Verwendungen öffnet den Unreal Editor.

Den Reflexionsmechanismus von UE4 verstehen


Die Reflexion in Unreal Engine wird mithilfe spezieller Makros (UCLASS, UFUNCTION, UPROPERTY usw.) implementiert. Der Fahrer weiß, dass die Parameter solcher Makros nicht nur Text sind. Der C ++ - Parser in ReSharper C ++ und Rider kann die Bedeutung dieser Makros wirklich „verstehen“, ohne das Unreal Header Build-Tool zu starten ( dh bevor der Inhalt der .generated.h- Dateien tatsächlich generiert wird ).

Übrigens wissen ReSharper C ++ und Rider über .generated.h- Dateien , dass automatisch hinzugefügte fehlende # include- Direktiven unbedingt eingefügt werden müssen, bevor .generated.h- Dateien verbunden werden . Berücksichtigen Sie diese generierten Dateien auch beim Umbenennen des Refactorings.

Zurück zum Reflexionsmechanismus: Es ist erwähnenswert, dass Reflexionsspezifizierer nicht nur Text in ReSharper C ++ und Rider sind. Es gibt Hinweise zur automatischen Vervollständigung und Dokumentation:

Reflexionsdokument

Dokumentationshinweise sind auch für Reflexionsmakros selbst verfügbar.

Der Code-Analysator überprüft die Verwendung von Reflexionsmakros und zeigt die damit verbundenen Fehler an. Zum Beispiel:

  • UCLASS-Klassen müssen öffentlich von UObject oder einer seiner untergeordneten Klassen geerbt werden. Darüber hinaus muss ein solcher Elternteil genau einer sein.
  • UCLASS-Spezifizierer sollten für Klassen verwendet werden, USTRUCT für Strukturen.
  • UE4-Klassen können nicht in anderen Klassen deklariert werden.
  • Objekte, die in Feldern gespeichert sind, die nicht als UPROPERTY gekennzeichnet sind, können vom Garbage Collector jederzeit erfasst werden.

RPC-Unterstützung (Remote Procedure Call) für Navigations- und Codegenerierungsaktionen


Wenn wir die Aufrufe von Remoteprozeduren aus der Sicht eines regulären C ++ - Parsers betrachten, werden Sie ziemlich schnell feststellen, dass der Parser nicht weiß, dass mehrere Funktionen mit unterschiedlichen Namen (z. B. Suffixe _Validateund _Implementation) einer Funktionsdeklaration entsprechen können . In ReSharper C ++ / Reiter haben wir einen Parser zu identifizieren RPC über Bezeich trainiert Client, Serverund NetMulticastin den Makro - Einstellungen UFUNCTION. Damit:

  • Die Navigation bietet alle notwendigen Möglichkeiten zur Implementierung der Funktion.
  • Codegenerierung können Funktionen mit Suffixe erstellen _Validateund _Implementationoder nur diejenigen , die fehlen:
    Rpc-Erzeugung
  • Die Code-Refactorings Umbenennen und Signatur ändern aktualisieren alle erforderlichen Funktionen und halten Ihren Code dadurch im richtigen Zustand.

Kenntnis der Namensregeln für Unreal Engine 4


ReSharper C ++ und Rider kennen die offiziellen Namensregeln im Unreal Engine-Code. Diese Regeln werden von der Entwicklungsumgebung in allen Aktionen zum Arbeiten mit Code verwendet, z. B. zum Generieren von Gettern und Setzern oder zum Refactoring einer Variablen (Introduce Variable). Und am wichtigsten ist, dass der Code für inkonsistente UE4-Namensinspektionen überprüft und eine entsprechende Schnellkorrektur durchgeführt wird, die das Umbenennen umbenennt und alle Verwendungen des Namens umbenennt, die nicht den Regeln entsprechen.

Editorleistung


Wir unterstützen Unreal Engine in ReSharper C ++ seit einiger Zeit in der Entwicklung, und natürlich sehen wir, dass die Leistung des Editors die Hauptbeschwerde ist. Aufgrund seiner Architektur ist Rider frei von vielen Leistungsproblemen, die in ReSharper auftreten (sie sind teilweise auf Studioeinschränkungen bei 32-Bit-Prozessen zurückzuführen, in denen ReSharper funktioniert, aber nicht nur).

Darüber hinaus optimieren wir die IDE speziell, um die Leistung der Unreal Engine zu verbessern. Wir indizieren zuerst den Code des Benutzerspiels und schließen sofort alle cleveren Aktionen des Editors auf den Benutzercode ein. Die Indizierung des Engine-Codes selbst erfolgt danach im Hintergrund. Es gibt mehrere zusätzliche Optionen zum Verwalten der Indizierung:

Performance-Optionen

Infolgedessen reagieren diejenigen, die Rider for Unreal Engine bereits verwendet haben, sehr positiv auf die Leistung des Editors! Und wir sind sicher, dass wir es noch besser machen können.

Video-Demo und noch einmal, wie man darauf zugreift


Diese und viele andere Funktionen können Sie in einem Demo-Video (in englischer Sprache) von unserem Entwickleranwalt in Aktion sehen:


Um diese Funktionen selbst auszuprobieren, füllen Sie einfach ein einfaches Formular aus und erhalten Sie einen Brief von uns mit einem Link zum Erstellen und Aktivieren einer kostenlosen Lizenz für eine frühzeitige Vorschau. Gehen Sie, füllen Sie aus , versuchen Sie, schreiben Sie Bewertungen! Für Ihr Feedback gibt es wie gewohnt Kommentare, einen Tracker ( ReSharper C ++ und Rider ) und unsere Support-Mail ( rider-cpp-support@jetbrains.com ).

Vielen Dank für Ihre Aufmerksamkeit!

Rider
The Drive to Develop Team

All Articles