Unreal Engine Blueprinting

Unser Software Engineer Christian Schneider erklärt das Blueprint Scripting-System der Unreal Engine.

Will man anspruchsvolle Games für Virtual Reality entwickeln, so ist eine der Schlüsselkomponenten die verwendete Game Engine. Unreal (https://www.unrealengine.com) ist neben Cry-Engine und Unity eine der top AAA Game Engines. Bis vor ein paar Jahren war es eine Closed-Source Plattform mit sehr kostspieliger Lizenzierung. Unter dem Druck von Unity und zur Verbesserung der Lebensdauer wurde der ganze Source-Code open sourced, mit einem sehr attraktiven Lizensierungsmodell, bei dem erst Kosten anfallen wenn ein hoher Umsatz mit dem Endprodukt erreicht wird. Die Real-Time Rendering Power von Unreal ist mittlerweile so beeindruckend, dass die Engine heute gerne auch für Filmrenderings (z.B. die letzten Star Wars Episoden) und zur Datenvisualisierung benutzt wird. 

Mit der Unreal Engine Version 4 hat Epic Games ein komplett überholtes und stark erweitertes Skripting-Tool mit dem Namen Blueprints Visual Scripting System etabliert, basierend auf dem Kismet-System bekannt aus frühen Versionen. Die Hauptmotivation war es, dass Programmierer und Designer besser und einfacher zusammenarbeiten können, und somit auch Nicht-Programmierern die Tools zur Verfügung zu stellen, eigene Features und sogar ganze Spiele zu entwickeln. 

Blueprint ist als High-Level Node-Based Scripting Engine umgesetzt, welche ein intuitives Interface bietet mit welchem jede Art von Skript-Event innerhalb der Engine aufgerufen werden kann. Hier sehen wir einen typischen Graph:

Loading...

Mit dieser Art von Kabelziehen, ähnlich z.B. wie bei einem modularen Synthesizer, kann jedes Objekt innerhalb des Games oder der Simulation gesteuert werden. Dieses System ist äußerst flexibel und leistungsstark, da es Designern die Möglichkeit bietet, praktisch die gesamte Palette von Konzepten und Tools zu nutzen, die im Allgemeinen nur Programmierern zur Verfügung stehen. Blueprint-spezifisches Markup, das in der C++-Implementierung der Engine verfügbar ist, ermöglicht es Programmierern außerdem, Baseline-Systeme zu erstellen, die von Designern erweitert werden können. 


Typen: Es gibt fünf verschiedene Typen von Blueprints im Unreal-Ecosystem wobei Level und Klasse die wichtigsten sind:

Level Blueprint

Eine spezielle Art von Blueprints die als einzige nicht separat erstellt werden können. Jedes Level erhält implizit einen solchen Blueprint. Hier werden zum Beispiel Variablen und Verhalten definiert, die für das ganze Level wichtig sind. Animations-Sequenzen werden auch über dieses Skript gesteuert.

Blueprint Klasse

Wird üblicherweise einfach Blueprint genannt. Dieser Typ ermöglicht es dem Ersteller von Inhalten, Funktionen zu vorhandenen Gameplay-Klassen hinzuzufügen. Dieser Typ Klasse eignet sich ideal für interaktive Objekte wie Türen, Schalter, Sammelobjekte und zerstörbare Items. Aufgrund der in sich geschlossenen Natur von Blueprints, können sie so konstruiert werden, dass sie in ein Level gezogen werden können und sie werden einfach direkt funktionieren, nur eine minimale Einrichtung oder Anpassung ist jeweils erforderlich. Dies bedeutet auch, dass das Bearbeiten eines Blueprints, der in einem Projekt verwendet wird, jede Instanz aktualisiert.


Elemente eines Blueprints

Graph: Diese Diagramme sind die Arbeitsfläche wo Blueprint-Funktionen erstellt werden. Innerhalb dieser Diagramme platziert und verbindet man die Knoten. Ereignisdiagramme enthalten die Ereignisse, die während des Application-Life-Cycles eines Blueprints ausgelöst werden. Diese Ereignisse können zum Beispiel das Tick-Ereignis sein, das bei jedem Frame aufgerufen wird, oder der ActorBeginOverlap-Event, das aufgerufen wird, wenn das Blueprint-Objekt ein anderes überlappt. Blueprint-Funktionen und Makros werden ebenfalls mithilfe des Graphen-Systems erstellt. Diese Diagramme sind jedoch unabhängig voneinander.

Funktionen: Häufig verwendete Mechanismen können in Blocks als Funktionen zusammengefasst werden. Diese Funktionen verhalten sich sehr ähnlich wie Funktionen in anderen Programmierspachen. Mit Blueprint-Funktionen können sowohl Eingabe- als auch Rückgabeparameter angeben werden.

Macros: Ähnlich wie Funktionen, aber nur intern verwendbar (private), was bedeutet, dass sie nur innerhalb des Blueprint selbst aufgerufen werden können. Makros werden vorwiegend zum Gruppieren einfacher Anweisungen verwendet, die sehr häufig aufgerufen werden. 

Variablen: Mit Blueprint-Variablen können Sie Datentypen erstellen, die Informationen speichern können. Je nach Verkapselungsstufe (public, private) können sie auch ausserhalb des Blueprints angesprochen werden. 

Event Dispatcher: Ereignis-Dispatcher ermöglichen es, Ereignisse miteinander zu verknüpfen. Dies ist den Delegates in anderen Sprachen sehr ähnlich.