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 und Skripten
Um genau zu wissen, wann Blueprint oder C++ verwendet werden sollte, müssen Sie zuerst den Unterschied zwischen Programmierung und Skripten verstehen.
- Programmierung: Anweisungen, die Systeme definieren
- Skript: 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 Kombinieren von Blueprints und C++.
Der Vergleich von Blueprint und C++
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.
Die Stärken von Blueprint
- Skripten: Blueprint kann einfacher Verhaltensweisen definieren.
- Schnellere Iteration: Blueprint eignet sich ideal für das Prototyping, da Sie damit Blueprint-Klassen schneller erstellen, ändern, kompilieren und testen können.
- Größere Zugänglichkeit: Die visuelle Ablaufdarstellung von Blueprint ist einfacher zu verstehend 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 einfacher neue Systeme aufbauen.
- 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 eine niedrigstufige Kontrolle über Systeme, Ressourcen und komplexe Algorithmen.
- Reibungslosere Zusammenarbeit: C++ wird als Text gespeichert, sodass es einfacher differenziert, zusammengeführt und zwischen Projekten gemeinsam genutzt werden kann. Sie können aber das Unreal Diff Tool mit Blueprints verwenden.
- Bessere Skalierbarkeit: Größere C++-Dateien lassen sich einfach ändern als große Blueprint-Diagramme.
- Besseres Debugging: Es gibt leistungsstärkere Debugging-Tools 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 nutzen
- Systeme, die große Datensätze verarbeiten
- Tickabhängige Klassen mit vielen Instanzen
- Szenarien, die von Multithreading profitieren, da dies von Blueprint nicht unterstützt wird
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 Engstellen, bevor Sie die Konvertierung des Blueprint in 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 Metadaten-Bezeichner wie
UPROPERTY(BlueprintReadWrite)oderUFUNCTION(BlueprintCallable), um bestimmte Elemente freizugeben. - Erstellen Sie eine C++-Klasse, die
UBlueprintFunctionLibraryfreigibt, 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:
- Verwenden Sie den Bezeichner
UFUNCTION(BlueprintImplementableEvent), um eine rein 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++ und Blueprint: Ein detailliertes Beispiel zum Erstellen einer von Blueprint erweiterbaren C++-Klasse
- Freigeben von C++ für Blueprints: Tipps und Tricks zum Schreiben von Blueprint-freundlicher API
- Freigeben von Gameplay-Elementen für Blueprints: Eine technische Anleitung für Gameplay-Programmierer zur Freigabe von Gameplay-Elementen für Blueprints
- Blueprint-Funktionsbibliothek: Erfahren Sie, wie Sie
UBlueprintFunctionLibraryverwenden. - Lyra-Beispielspiel: Erfahren Sie mehr über das Lyra-Projekt, das Beispiele zu jeder der oben erläuterten Methoden bietet.
Konvertieren von Blueprint in C++
Wenn Sie Blueprint in C++ umwandeln möchten, können Sie als Erstes eine Blueprint-Header-Ansicht verwenden, um eine C++-Header-Datei für eine Blueprint-Klasse oder eine 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 entsprechende .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 Kern-Umleitungen in Erwägung ziehen, um diese Referenzen automatisch neu zuzuordnen.