Du kannst ein UE-Projekt (Unreal Engine) nur mit Blueprint oder C++ erstellen, aber die meisten Projekte profitieren von der Verwendung einer Kombination der beiden. Wie entscheide ich also für die beste Mischung aus Blueprint und C++ für mein Projekt? Dieses Dokument bietet Ihnen einen Leitfaden zur Antwort auf diese Frage.
Programmierung vs. Scripting
Um genau zu wissen, wann Blueprint oder C++ verwendet werden sollte, müssen Sie zuerst den Unterschied zwischen Programmierung und Skripten verstehen.
Programmierung: Befehle, die Systeme definieren.
Scripting: Anweisungen, die Verhaltensweisen definieren, indem Schnittstellen mit bestehenden Systemen genutzt werden.
Sie können zum Beispiel die Programmierung nutzen, um ein Fahrzeugsystem zu definieren, das die Basisfunktionalität verarbeitet, wie Beschleunigung und das Lenken, und Skripten nutzen, um bestimmte Fahrzeugtypen zu definieren, wie Autos oder Boote.
In diesem Kontext ist C++ eine Programmiersprache und Blueprint ist eine Skriptsprache. Dies ist aber keine klare Unterscheidung, da Sie C++ nutzen können, um Verhaltensweisen zu definieren, oder Blueprint, um Systeme zu definieren. Des Weiteren gibt es Momente in Projekten, in denen die Grenzen zwischen Programmierung und Skripten verschwimmen und die beste Teilung zwischen den beiden vom Szenario abhängt.
Blueprint fungiert als Skriptsprache, indem Schnittstellen zu freigegebener UE-Funktionalität hergestellt werden. Entsprechend können Sie Ihre benutzerdefinierte Funktionalität für Blueprints freigeben. Weitere Informationen finden Sie unter Combining Blueprints and C++.
Blueprint und C++ im Vergleich
Da jedes Projekt und Team einzigartig ist, gibt es keine „richtige Wahl“, wenn es um die Entscheidung für Blueprint oder C++ geht, aber wir empfehlen, ihre Stärken zu berücksichtigen, bevor Sie sie verwenden.
Blueprint-Stärken
Scripting: Blueprint kann einfacher Verhaltensweisen definieren.
Schnellere Iteration: Blueprints eignen sich hervorragend für Prototyping, da sich Blueprint-Klassen schneller erstellen, anpassen, kompilieren und testen lassen.
Größere Zugänglichkeit: Die visuelle Ablaufdarstellung von Blueprint ist einfacher zu verstehen und zu nutzen, wodurch es für visuell orientierte Programmierer oder Nicht-Programmierer wie Designer und Künstler ansprechender ist.
Größere Entdeckbarkeit: Mit Blueprint ist es einfacher, API- und Assetreferenzen zu suchen und einzuschließen.
Sichereres Speichermodell: Wir haben Blueprints so konzipiert, dass sie ein sicheres Speichermodell bieten, um Abstürze zu vermeiden.
Die Stärken von C++
Programmierung: C++ kann mehr neue Systeme bauen.
Schnellere Laufzeit-Performance: C++ ist leistungsfähiger, aber die Bedeutung hängt vom Kontext ab. Ausführliche Informationen dazu finden Sie im Abschnitt „Leistungsüberlegungen“ weiter unten.
Umfangreicherer Zugriff: C++ hat Zugriff auf die niedrigstufigere UE-Funktionalität.
Umfangreichere Erweiterbarkeit: Mit C++ können Sie externe Systeme und Bibliotheken erstellen und Schnittstellen mit ihnen erstellen.
Größere Kontrolle: C++ gewährt Kontrolle über Systeme, Ressourcen und komplexe Algorithmen auf niedriger Ebene.
Reibungslosere Zusammenarbeit: C++ wird als Text gespeichert, sodass es einfacher differenziert, zusammengeführt und zwischen Projekten gemeinsam genutzt werden kann. Sie können jedoch das Unreal Diff Tool mit Blueprints verwenden.
Bessere Skalierbarkeit: Große C++-Dateien lassen sich einfacher ändern als große Blueprint-Diagramme.
Besseres Debugging: Es gibt mehr Debugging-Werkzeuge für C++ als den Blueprint Debugger.
Leistungsüberlegungen
Im Grunde ist C++ aus folgenden Gründen stärker leistungsfähiger als Blueprint:
C++ kompiliert in Maschinencode, der direkt von der CPU ausgeführt wird.
Blueprints kompilieren in Bytecode, der auf einem virtuellen Rechner ausgeführt wird.
Das bedeutet, dass es bei Blueprint zu zusätzlichem Scriptausführung-Overhead kommt. Die Leistungsunterschiede zwischen Blueprint und C++ sind aber im Allgemeinen unbedeutend und kontextabhängig. Die folgenden Beispiele sind Kontexte, bei denen Sie mit den stärksten Auswirkungen rechnen können:
Niedrigstufige Kerninfrastruktur.
Enge Schleifen, die umfangreiche E/A- oder Verarbeitungsressourcen stark nutzen.
Systeme, die große Datensätze verarbeiten.
Tickabhängige Klassen mit vielen Instanzen.
Szenarien, die von Multithreading profitieren, da Blueprint dies nicht unterstützt.
Um die Performance zu verbessern, sollten Sie Timer oder Delegaten nutzen, um die Arbeit in Blueprints zu planen, anstatt Tick zu verwenden.
Wenn Sie Blueprint nutzen und es zu Leistungsproblemen kommt, erstellen Sie ein Profil Ihres Projekts mit Unreal Insights und optimieren Sie die bedeutendsten Engpässe, bevor Sie die converting your Blueprint to C++ in Erwägung ziehen.
Kombinieren von Blueprint und C++
Der beste Ansatz zur Kombination von Blueprint und C++ besteht darin, C++ als Grundlage zu nutzen und darauf Blueprint-Klassen aufzubauen. In der Praxis bedeutet dies, dass Sie Ihr C++ freigeben, damit es von Blueprints genutzt werden kann.
Sie können C++ anhand der folgenden Methoden für Blueprint freigeben:
Erstellen Sie eine Blueprint-Klasse, die eine C++-Klasse erweitert, und verwenden Sie Metadata Specifiers wie
UPROPERTY(BlueprintReadWrite)oderUFUNCTION(BlueprintCallable), um bestimmte Elemente freizugeben.Erstellen Sie eine C++-Klasse, die
UBlueprintFunctionLibraryerweitert, um die statischen Funktionen der Klasse freizugeben.
In einigen weniger gängige Fällen sollten Sie evtl. Blueprint für C++ freigeben, was auf folgende Arten möglich ist:
Nutzen Sie den
UFUNCTION(BlueprintImplementableEvent)-Bezeichner, um eine reine virtuelle Funktion zu definieren, die Sie in Blueprint implementieren müssen.Verwenden Sie den Bezeichner
UFUNCTION(BlueprintNativeEvent), um eine virtuelle Funktion zu definieren, die Sie optional in Blueprint außer Kraft setzen können.Wenn Sie eine Benutzeroberfläche erstellen, können Sie mit
UPROPERTY(meta=(BindWidget))auf ein UserWidget zugreifen, das in Blueprint erstellt wurde.
Weitere Informationen zu diesen Methoden finden Sie auf den folgenden Seiten:
C++ and Blueprint: Ein detailliertes Beispiel zum Erstellen einer von Blueprint erweiterbaren C++-Klasse.
Exposing C++ to Blueprints: Tipps und Tricks zum Schreiben von Blueprint-freundlichen APIs.
Exposing Gameplay Elements to Blueprints: Eine technische Anleitung für Gameplay-Programmierer zur Freigabe von Gameplay-Elementen für Blueprints.
Blueprint Function Library: Lernen Sie, wie Sie
UBlueprintFunctionLibraryverwenden.Lyra Sample Game: Erfahren Sie mehr über das Projekt Lyra, das Beispiele zu jeder der oben erläuterten Methoden bietet.
Konvertieren von Blueprint in C++
Wenn Sie Ihr Blueprint in C++ konvertieren möchten, können Sie zunächst die Blueprint Header View verwenden, um eine C++-Header-Datei für eine Blueprint-Klasse oder -Struktur zu generieren. Die generierte .h Datei enthält alle Variablen- und Funktionsdeklarationen aus Ihrem Blueprint, aber Sie müssen Ihre Funktionsimplementierung manuell in die passende .cpp-Datei konvertieren.
Nach der Konvertierung eines Blueprint in C++ müssen Sie möglicherweise die Referenzen für die Verwendung der neuen C++-Klasse aktualisieren. Wenn dies zu zu vielen Aktualisierungen führt, sollten Sie die Verwendung von Core Redirects in Erwägung ziehen, um diese Referenzen automatisch neu zuzuordnen.