Cómo convertirse en un experto en automatización irreal

Tabla de contenido

  1. Automatización de flujos de trabajo con Blueprints, C ++ y Python
  2. Por qué es interesante Unreal Engine
    • Por qué utilizar Blueprints para el flujo de trabajo e incluso la programación de juegos
    • Por que usar C ++ para flujo de trabajo y programación de juegos
    • Por qué utilizar Python para optimizar el flujo de trabajo
  3. Escribiendo nuestro propio script de limpieza de proyectos automatizado usando Python
    • Pero, ¿vale la pena?
  4. Aprenda a automatizar y optimizar los flujos de trabajo con secuencias de comandos en Udemy

Automatización de flujos de trabajo con Blueprints, C ++ y Python

Cada trabajo tiene tareas y procesos repetitivos que se pueden automatizar. Esas tareas pueden consumir una cantidad significativa de su tiempo.

Alguien con solo conocimientos básicos sobre secuencias de comandos puede crear una secuencia de comandos que podría reducir el tiempo para ejecutar esas tareas al mínimo. A la larga, este ahorro de tiempo se acumula en horas adicionales que pueden utilizarse para un trabajo más productivo.

Aprender a automatizar las cosas, por lo tanto, es una habilidad invaluable . Una habilidad que se puede adquirir en diferentes sectores más específicos y luego aplicar a otros más generales.

Especialmente considerando los tiempos difíciles actuales, es vital aprender una nueva habilidad que tendrá un impacto significativo en su empleabilidad.

En este artículo, queremos describir la importancia de la automatización cuando se trabaja con software en tiempo real como Unreal Engine.

Por qué el Unreal Engine es interesante

Unreal Engine de Epic es uno de los juegos y aplicaciones 3D en tiempo real más populares que existen. Se utiliza para la creación de contenido de entretenimiento como juegos y configuraciones interactivas.

Disciplinas como la realidad virtual y aumentada requieren el uso de procesos sofisticados que, al igual que cualquier otro canal, se pueden optimizar mediante la automatización.

Además de eso, el mercado de juegos y 3D en tiempo real está creciendo continuamente, lo que aumenta la demanda de talento.

Según un estudio realizado por Burning Glass Technologies, una firma de análisis del mercado laboral, los salarios promedio de los desarrolladores de Unreal aumentaron en un 22% el año pasado , los salarios de los artistas, en un 51% .

Por qué utilizar Blueprints para el flujo de trabajo e incluso la programación de juegos

Además de la interfaz de programación general de C ++, Unreal Engine proporciona un sistema de programación gráfica llamado Blueprints . Exponen la funcionalidad completa como código C ++, lo que significa que todo, incluidas las funciones del juego, se puede programar sin grandes inconvenientes de rendimiento.

La interfaz gráfica nos permite componer entidades rápidamente en un flujo para crear funcionalidad. Mirando un ejemplo que establece el material para un actor de malla estática, podemos ver que el Blueprint es fácilmente legible.

Por que usar C ++ para flujo de trabajo y programación de juegos

El enfoque "nativo" de la codificación del motor irreal es C ++. Se utiliza para crear lógica en el juego, simplificar la creación de niveles y los flujos de trabajo, y mejorar el proceso de desarrollo. Es más complejo y difícil de aprender que los Blueprints, pero puede agregar un impulso adicional en el tiempo de ejecución y el rendimiento.

Su ventaja de rendimiento lo convierte en el lenguaje elegido para operaciones esenciales de bajo nivel, como renderizado y física en el desarrollo de juegos. Para los desarrolladores que ya dominan C ++, es una adición conveniente poder automatizar procesos sin aprender un idioma adicional directamente.

Por qué utilizar Python para optimizar el flujo de trabajo

En comparación con Blueprints o C ++, Python es uno de los lenguajes estándar de facto utilizados para automatizar tareas . Es fácil de aprender, comprensible y extremadamente versátil, ya que puede ejecutarse en casi cualquier plataforma sin esfuerzo adicional.

Epic enumera Python como una de las habilidades necesarias, por ejemplo, para Data Pipeliners en su Creator's Field Guide to Emerging Careers in Interactive 3D.

El Unreal Engine tiene soporte para scripts de Python completa . Desafortunadamente, no es adecuado para secuencias de comandos en tiempo real y en el juego, pero solo se puede usar para secuencias de comandos de Unreal Editor. Sin embargo, la simplicidad de Python lo convierte en una opción increíble para la creación rápida de prototipos de automatización de canalizaciones.

Los propios Epic intentan promover el uso de Python utilizando la documentación, los documentos de la API e incluso un seminario web grabado sobre las secuencias de comandos de Python para Unreal Engine.

Escribiendo nuestro propio script de limpieza de proyectos automatizado usando Python

Los proyectos más grandes pueden complicarse rápidamente. Tener un script a mano que pueda hacer una limpieza al observar todos nuestros activos seleccionados y moverlos automáticamente a las carpetas apropiadas nos ayuda a mejorar drásticamente nuestro flujo de trabajo.  

El siguiente dibujo esquemático explica la idea detrás del guión.

A partir de ahora, la versión predeterminada de Python establecida en Unreal es Python 2.7. Si desea utilizar Python 3, puede seguir el proceso que se describe aquí para cambiar a Python 3.

Para empezar, primero necesitamos importar la biblioteca irreal a nuestro alcance. Una vez hecho esto, podemos crear instancias de clase de las clases elementales. Por ahora, solo necesitamos el EditorUtilityLibraryque nos permite obtener una lista de todos los activos seleccionados.

Podemos obtener la cantidad de activos seleccionados usando el len()método de Python y usar el método de registro de Unreal para obtener resultados en el registro de depuración en Unreal Engine.

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)

El fragmento de código anterior imprimirá un solo número en el Debug Log. Para cada uno de los activos seleccionados, ahora queremos obtener información como el nombre y la clase del activo.

El ObjectBaseobjeto Unreal tiene varios métodos auxiliares para obtener el nombre, la clase y otros atributos. Usaremos los métodos get_fname()y get_class().

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 :)