So werden Sie ein unwirklicher Automatisierungsexperte

Inhaltsverzeichnis

  1. Automatisieren von Workflows mit Blueprints, C ++ und Python
  2. Warum die Unreal Engine interessant ist
    • Warum sollten Sie Blueprints für den Workflow und sogar für die Spielprogrammierung verwenden?
    • Warum C ++ für Workflow- und Spielprogrammierung verwenden?
    • Warum Python zur Workflow-Optimierung verwenden?
  3. Schreiben unseres eigenen automatisierten Projektbereinigungsskripts mit Python
    • Aber zahlt es sich aus?
  4. Erfahren Sie, wie Sie Workflows mithilfe von Skripten in Udemy automatisieren und optimieren

Automatisieren von Workflows mit Blueprints, C ++ und Python

Jeder Job hat sich wiederholende Aufgaben und Prozesse, die automatisiert werden können. Diese Aufgaben können einen erheblichen Teil Ihrer Zeit in Anspruch nehmen.

Jemand mit nur Grundkenntnissen in Skripten kann ein Skript erstellen, das die Zeit für die Ausführung dieser Aufgaben auf ein Minimum reduziert. Langfristig summiert sich diese Zeitersparnis auf zusätzliche Stunden, die für produktivere Arbeiten verwendet werden können.

Zu lernen, wie man Dinge automatisiert, ist daher eine unschätzbare Fähigkeit . Eine Fähigkeit, die in verschiedenen, spezifischeren Sektoren erworben und dann auf andere, allgemeinere Sektoren angewendet werden kann.

Insbesondere in Anbetracht der derzeit schwierigen Zeiten ist es wichtig, eine neue Fähigkeit zu erlernen, die sich erheblich auf Ihre Beschäftigungsfähigkeit auswirkt.

In diesem Artikel möchten wir die Bedeutung der Automatisierung bei der Arbeit mit Echtzeitsoftware wie der Unreal Engine beschreiben.

Warum die Unreal Engine interessant ist

Die Unreal Engine von Epic ist eine der beliebtesten Spiel- und Echtzeit-3D-Anwendungen. Es wird für die Erstellung von Unterhaltungsinhalten wie Spielen und interaktiven Setups verwendet.

Disziplinen wie Virtual Reality und Augmented Reality erfordern die Verwendung ausgefeilter Prozesse, die wie jede andere Pipeline durch Automatisierung optimiert werden können.

Darüber hinaus wächst der Gaming- und 3D-Echtzeitmarkt kontinuierlich, was die Nachfrage nach Talenten erhöht.

Laut einer Studie von Burning Glass Technologies, einem Arbeitsmarktanalyseunternehmen, stiegen die Durchschnittsgehälter für Unreal-Entwickler im vergangenen Jahr um 22% , die Löhne für Künstler um 51% .

Warum sollten Sie Blueprints für den Workflow und sogar für die Spielprogrammierung verwenden?

Zusätzlich zur allgemeinen C ++ - Programmierschnittstelle bietet die Unreal Engine ein grafisches Programmiersystem namens Blueprints . Sie stellen die volle Funktionalität als C ++ - Code zur Verfügung, was bedeutet, dass alles, einschließlich der Funktionen im Spiel, ohne große Leistungseinbußen programmiert werden kann.

Die grafische Oberfläche ermöglicht es uns, Entitäten schnell zu einem Flow zusammenzusetzen, um Funktionen zu erstellen. Wenn wir uns ein Beispiel ansehen, das das Material für einen statischen Netzakteur festlegt, können wir sehen, dass der Blueprint leicht lesbar ist.

Warum C ++ für Workflow- und Spielprogrammierung verwenden?

Der "native" Ansatz zum Codieren für die unwirkliche Engine ist C ++. Es wird verwendet, um Logik im Spiel zu erstellen, die Erstellung von Levels und Workflows zu vereinfachen und die Entwicklungspipeline zu verbessern. Es ist komplexer und schwieriger zu erlernen als Blueprints, kann aber die Laufzeit und Leistung zusätzlich steigern.

Aufgrund seines Leistungsvorteils ist es die Sprache der Wahl für wichtige Operationen auf niedrigerer Ebene wie Rendering und Physik in der Spieleentwicklung. Für Entwickler, die bereits mit C ++ vertraut sind, ist es eine bequeme Ergänzung, Prozesse automatisieren zu können, ohne direkt eine zusätzliche Sprache zu lernen.

Warum Python zur Workflow-Optimierung verwenden?

Im Vergleich zu Blueprints oder C ++ ist Python eine der De-facto-Standardsprachen für die Automatisierung von Aufgaben . Es ist einfach zu erlernen, verständlich und äußerst vielseitig, da es ohne zusätzlichen Aufwand auf nahezu jeder Plattform ausgeführt werden kann.

Epic listet Python als eine der erforderlichen Fähigkeiten auf, z. B. für Data Pipeliners im Field Guide ihres Entwicklers für aufstrebende Karrieren in Interactive 3D.

Die Unreal Engine bietet vollständige Unterstützung für Python-Skripte . Leider ist es nicht für Echtzeit- und In-Game-Skripte geeignet, sondern kann nur für Unreal Editor-Skripte verwendet werden. Die Einfachheit von Python macht es jedoch zu einer unglaublichen Option für das schnelle Prototyping der Pipeline-Automatisierung.

Epic selbst versucht, die Verwendung von Python mithilfe der Dokumentation, der API-Dokumente und sogar eines aufgezeichneten Webinars über Python-Skripte für die Unreal Engine zu fördern.

Schreiben unseres eigenen automatisierten Projektbereinigungsskripts mit Python

Größere Projekte können schnell chaotisch werden. Wenn wir ein Skript zur Hand haben, mit dem wir alle ausgewählten Assets bereinigen und automatisch in die entsprechenden Ordner verschieben können, können wir unseren Workflow drastisch verbessern.  

Die folgende schematische Zeichnung erklärt die Idee hinter dem Skript.

Die in Unreal festgelegte Standardversion von Python ist derzeit Python 2.7. Wenn Sie Python 3 verwenden möchten, können Sie den hier beschriebenen Vorgang ausführen, um zu Python 3 zu wechseln.

Zunächst müssen wir die unwirkliche Bibliothek in unseren Bereich importieren. Sobald wir dies getan haben, können wir Klasseninstanzen der Elementarklassen erstellen. Im Moment brauchen wir nur das, EditorUtilityLibrarywas es uns ermöglicht, eine Liste aller ausgewählten Assets zu erhalten.

Wir können die Anzahl der ausgewählten Assets mithilfe der Python- len()Methode ermitteln und die Protokollierungsmethode von Unreal verwenden, um die Ausgabe im Debug-Protokoll in der Unreal Engine abzurufen.

import unreal # create unreal class instances editor_util = unreal.EditorUtilityLibrary() # get the selected assets selected_assets = editor_util.get_selected_assets() num_assets = len(selected_assets) unreal.log(num_assets)

Das obige Code-Snippet druckt eine einzelne Zahl auf das Debug Log. Für jedes der ausgewählten Assets möchten wir nun einige Informationen wie den Namen und die Klasse des Assets erhalten.

Das Unreal- ObjectBaseObjekt verfügt über mehrere Hilfsmethoden, um den Namen, die Klasse und andere Attribute abzurufen. Wir werden die get_fname()und get_class()Methoden anwenden.

for assets in selected_assets: # get the class instance and the clear text name asset_name = asset.get_fname() asset_class = asset.get_class() unreal.log("{} - {}".format(asset_name, asset_class))

However, this will only give us the class definition and not the clear text name of the class itself, which we want to use for folder creation.

To get the display name instead of the class definition, we need to create an instance of the SystemLibrary. It's get_class_display_name() method takes a class definition and returns the class name as String.

# create unreal class instances editor_util = unreal.EditorUtilityLibrary() system_lib = unreal.SystemLibrary() ... for assets in selected_assets: # get the class instance and the clear text name asset_name = asset.get_fname() asset_class = asset.get_class() class_name = system_lib.get_class_display_name(asset_class) unreal.log("Name: {} - Class: {}".format(asset_name, class_name)) 

Now we can see something like this "Name: NewMaterial - Class: Material" printed to our log. This is precisely the kind of information we needed.

The last step is to "rename" our assets to a given location. For example, every Material will be renamed to "/Material/" which will move it into the according to folders.

To "rename" assets, we need an additional class. The rename_loaded_asset() method is part of the EditorAssetLibrary, so we need to create an instance of this class first. In addition to that, we have to create a new location to which the asset will be relocated.

To keep this more platform-independent, we will use the os module and its path.join() method.

Once we have created the new_path variable, we can use it in the method call to rename_loaded_asset() to relocate our current asset.

import os import unreal # create unreal class instances editor_util = unreal.EditorUtilityLibrary() system_lib = unreal.SystemLibrary() editor_asset_lib = unreal.EditorAssetLibrary() ... for assets in selected_assets: # get the class instance and the clear text name asset_name = asset.get_fname() asset_class = asset.get_class() class_name = system_lib.get_class_display_name(asset_class) # assemble new path and relocate asset new_path = os.path.join("/Game", class_name, asset_name) editor_asset_lib.rename_loaded_asset(asset_name, new_path) unreal.log("Moved {} to {}".format(asset_name, new_path))

Executing this script in the Unreal Engine, the log will provide you with such a message: "Moved NewMaterial to /Game/Material/NewMaterial".

Observing our project, we can now see that all the selected assets have been cleaned into folders named according to their classes.

As you can see, creating a basic script is quite simple. Of course, we need to take care of error handling, suitable logging, and a friendly user interface for more sophisticated tools, but even simple scripts can save a lot of time.  

But does it pay off?

To show you how big the demand for automation in this sector is, here is a screenshot of the monthly sales of a tool with functionality containing the script we created in this article.

Of course, it is essential to understand the needs of users and artists working in the Unreal Engine to know which tasks are suitable for automation.

Learn how to automate and optimise workflows with scripting on Udemy

To help close the gap of Unreal scripting resources, we created an extensive Udemy on-demand course to learn Unreal Engine Editor scripting from scratch.

You can use the promo code, AUTOMATEUNREAL20. You can get the course for as little as $10 now. That’s less than three Frappuccinos from Starbucks!

If you have any questions or feedback, feel free to reach out to us on Twitter or directly in the discussion section of the course :)