Puedes crear un proyecto de Unreal Engine (UE) usando solo Blueprint o C++, pero la mayoría de los proyectos se benefician de usar una mezcla de ambos. Así que, ¿cómo puedes decidir cuál es la mejor combinación de Blueprint y C++ para tu proyecto? Este documento te ayuda a responder esta pregunta.
Programación o Secuencias de comandos
La mejor forma de saber cuándo usar Blueprint o C++ es comprender la diferencia entre programación y secuenciación de comandos.
Programación: instrucciones que definen sistemas.
Secuencia de comandos: instrucciones que definen comportamientos mediante la interacción con sistemas existentes.
Por ejemplo, puedes usar la programación para definir el sistema de un vehículo que gestiona la funcionalidad básica, como la aceleración y la dirección, y usar la secuenciación de comandos para definir tipos específicos de vehículos, como coches o barcos.
En este contexto, C++ es un lenguaje de programación y Blueprint es un lenguaje de secuenciación de comandos. Sin embargo, no hay una distinción clara, ya que puedes usar C++ para definir comportamientos o Blueprint para definir sistemas. Además, hay ocasiones dentro de los proyectos en las que las líneas entre programación y secuenciación de comandos son difusas y sus diferencias se aprecian de una forma más clara en función de la situación.
Blueprint funciona como un lenguaje de secuenciación de comandos que interactúa con la funcionalidad de UE expuesta. Del mismo modo, puedes exponer tu funcionalidad personalizada a Blueprint. Para obtener más información, consulta Combinación de blueprints y C++.
Comparación de blueprint y C++
Cada proyecto y equipo son únicos, por lo que no hay una «elección correcta» a la hora de optar por usar Blueprint o C++, pero te recomendamos que tengas en cuenta sus puntos fuertes antes de usarlos.
Puntos fuertes de blueprint
Secuencia de comandos: blueprint puede definir comportamientos más fácilmente.
Iteración más rápida: blueprint es excelente para la creación de prototipos, ya que es más rápido crear, modificar, compilar y probar clases de blueprint.
Mayor accesibilidad: la representación del flujo visual de blueprint es más fácil de comprender y usar, por lo que es accesible para programadores o no programadores (por ejemplo, diseñadores y artistas, que prefieren lo visual).
Mayor capacidad de detección: con blueprint, es más sencillo buscar e incluir referencias a recursos y API.
Modelo de memoria más seguro: hemos diseñado los blueprints para tener un modelo de memoria seguro que evite errores.
Puntos fuertes de C++
Programación: C++ permite compilar nuevos sistemas más fácilmente.
Mayor rendimiento en tiempo de ejecución: C++ tiene un mayor rendimiento, pero la significación depende del contexto. Consulta a continuación la sección Cuestiones relacionadas con el rendimiento si deseas una información más detallada.
Mayor acceso: C++ tiene acceso a funcionalidad de UE de menor nivel.
Más extensibilidad: con C++, puedes crear bibliotecas y sistemas externos e interactuar con ellos.
Mayor control: C++ otorga un control de bajo nivel sobre sistemas, recursos y algoritmos complejos.
Mejor colaboración: C++ se almacena como texto, por lo que es más sencillo comparar, fusionar y compartir entre proyectos. Sin embargo, puedes usar la herramienta de diferencias de UE con blueprints.
Mejor escalabilidad: los archivos grandes de C++ son más fáciles de modificar que los grafos de blueprint grandes.
Mejor depuración: existen herramientas de depuración para C++ más potentes que el depurador de blueprints.
Cuestiones relacionadas con el rendimiento
Fundamentalmente, C++ tiene más rendimiento que Blueprint por los siguientes motivos:
C++ compila en lenguaje de máquina que se ejecuta directamente en la CPU.
Los blueprints se compilan en código intermedio que se ejecuta en una máquina virtual.
Esto significa que Blueprint tiene una sobrecarga adicional en la ejecución de secuencias de comandos. Sin embargo, las diferencias de rendimiento de Blueprint y C++ suelen ser insignificantes y dependen del contexto. Los siguientes ejemplos son contextos en los que puedes esperar el mayor impacto:
Infraestructura básica de bajo nivel.
Bucles ajustados que usan muchos recursos de procesamiento o E/S.
Sistemas que procesan grandes conjuntos de datos.
Clases dependientes de tic con muchas instancias.
Situaciones que se benefician de los subprocesos, ya que blueprint no los admite.
Para mejorar el rendimiento, usa cronómetros o delegados para programar el trabajo en Blueprint en lugar de usar el tic.
Si usas blueprint y tienes problemas de rendimiento, perfila tu proyecto con Unreal Insights y optimiza las sobrecargas más importantes antes de considerar convertir blueprint a C++.
Combinación de blueprint y C++
Lo mejor para combinar Blueprint y C++ es usar C++ como base y compilar clases de Blueprint a partir de él. En la práctica, esto significa exponer tu C++ para que pueda usarse desde Blueprint.
Puedes exponer C++ a Blueprint con los siguientes métodos:
Crea una clase de blueprint que amplíe una clase C++ y usa especificadores de metadatos, como
UPROPERTY(BlueprintReadWrite)oUFUNCTION(BlueprintCallable), para exponer elementos específicos.Crea una clase C++ que amplíe
UBlueprintFunctionLibrarypara exponer las funciones estáticas de la clase.
En algunos casos menos comunes, te aconsejamos exponer Blueprint a C++, cosa que puedes hacer con los siguientes métodos:
Usa el especificador
UFUNCTION(BlueprintImplementableEvent)para definir una función virtual pura que debes implementar en blueprint.Usa el especificador
UFUNCTION(BlueprintNativeEvent)para definir una función virtual que puedes anular opcionalmente en blueprint.Al crear una interfaz de usuario, puedes acceder a un UserWidget creado en blueprint usando
UPROPERTY(meta=(BindWidget)).
Para obtener más información sobre estos métodos, consulta las siguientes páginas:
C++ y blueprint: un ejemplo detallado sobre la creación de una clase C++ ampliable con blueprint.
Exposición de C++ a blueprints: trucos y consejos para escribir una API compatible con blueprints.
Exposición de elementos de juego a blueprints: una guía técnica para programadores de juegos sobre la exposición de elementos de juego a blueprints.
Biblioteca de funciones de blueprint: obtén más información sobre cómo usar
UBlueprintFunctionLibrary.Juego de muestra Lyra: aprende sobre el proyecto Lyra, que tiene ejemplos de cada uno de los métodos mencionados anteriormente.
Cómo convertir blueprint a C++
Si quieres convertir blueprint a C++, empieza por usar el visor de cabeceras de blueprint para generar un archivo de cabecera de C++ en una estructura o clase de blueprint. El archivo .h generado contiene todas las declaraciones de variables y funciones de blueprint, pero debes convertir manualmente la implementación de tu función al archivo .cpp correspondiente.
Tras convertir un blueprint a C++, es posible que tengas que actualizar las referencias para usar la nueva clase C++. Si esto requiere muchas actualizaciones, puedes usar redireccionamientos de núcleo para reasignar esas referencias automáticamente.