De Unity a Godot Engine

Esta guía proporciona una visión general del motor Godot desde el punto de vista de un usuario Unity y apunta a ayudarte a migrar tu experiencia actual en Unity al mundo de Godot.

Nota

Este artículo habla sobre versiones anteriores de Unity. Se agregaron prefabricados anidables (“Nested prefabs”) a Unity 2018.3. Los prefabricados anidables son análogos a las escenas de Godot, y permiten un enfoque más parecido a Godot para la organización de la escena.

Diferencias

  Unity Godot
Licencia Licencia propietaria, cerrada y libre con límites de ingresos y restricciones de uso Licencia MIT, libre y completamente open source sin ninguna restricción
OS (editor) Windows, macOS, Linux (no oficial y sin soporte) Windows, macOS, X11 (Linux, *BSD)
OS (exportar)
  • Escritorio: Windows, macOS, Linux
  • Móvil: Android, iOS, Windows Phone, Tizen
  • Web: WebAssembly o asm.js
  • Consolas: PS4, PS Vita, Xbox One, Xbox 360, Wii U, Nintendo 3DS
  • VR: Oculus Rift, SteamVR, Google Cardboard, Playstation VR, Gear VR, HoloLens
  • TV: Android TV, Samsung SMART TV, tvOS
Sistema de escenas
  • Componente/Escena (GameObject > Componente)
  • Prefabs
Árbol de escenas y nodos, permitiendo que las escenas se aniden y/o hereden otras escenas
Herramientas de terceros Visual Studio o VS Code
Ventajas notables
  • Gran comunidad
  • Gran almacén de recursos

El editor

Godot Engine proporciona un editor con numerosas funciones para que puedas crear tus juegos. Las siguientes imágenes muestran los diseños predeterminados de ambos editores con bloques de color para indicar funcionalidades comunes.

../../_images/unity-gui-overlay.png ../../_images/godot-gui-overlay.png

Aunque ambos editores pueden parecer similares, hay muchas diferencias bajo la superficie. Ambos permiten organizar el proyecto usando el Sistema de Archivos, pero el enfoque de Godot es más simple al contar con un solo archivo de configuración, un formato de texto minimalista y sin metadatos. Esto hace que Godot sea más amigable con los sistemas VCS, como Git, Subversion o Mercurial.

El panel de escenas de Godot es similar al panel de jerarquía de Unity pero, como cada nodo tiene una función específica, el enfoque utilizado por Godot es más descriptivo visualmente. Es más fácil entender lo que hace una escena a primera vista.

El inspector de Godot es más minimalista, sólo muestra propiedades. Gracias a esto, los objetos pueden mostrar al usuario parámetros más útiles sin necesidad de ocultar la funcionalidad en las APIs del lenguaje. Como ventaja, Godot permite animar visualmente cualquiera de estas propiedades. Es posible cambiar colores, texturas, enumeraciones o incluso enlaces a recursos en tiempo real sin necesidad de escribir código.

La barra de herramientas en la parte superior de la pantalla es similar en ambos editores, ofreciendo control sobre la reproducción del proyecto. Los proyectos en Godot se ejecutan en una ventana separada, en lugar de hacerlo dentro del editor (pero el árbol y los objetos pueden ser explorados en la ventana del depurador).

Este enfoque tiene como desventaja que en Godot el juego activo no puede ser explorado desde diferentes ángulos (aunque esto podría ser soportado en un futuro y ya es posible mostrar gizmos de colisión en el juego activo), pero a cambio tiene varias ventajas:

  • Ejecutar el proyecto y cerrarlo es rápido (Unity tiene que guardar, ejecutar el proyecto, cerrar el proyecto, y luego recargar el estado anterior).
  • La edición en vivo es mucho más útil porque los cambios hechos al editor tienen efecto inmediatamente en el juego y no se pierden (ni tienen que ser sincronizados) cuando el juego está cerrado. Esto permite flujos de trabajo fantásticos, como crear niveles mientras los reproduces.
  • El editor es más estable porque el juego se ejecuta en un proceso separado.

Finalmente, la barra de herramientas superior de Godot incluye un menú para depuración remota. Estas opciones facilitan la implementación en cualquier dispositivo (teléfono, tableta o navegador conectado a través de HTML5) y la depuración/edición en vivo en él después de exportar el juego.

El sistema de escenas

Esta es la diferencia más importante entre Unity y Godot, y la función favorita de la mayoría de los usuarios de Godot.

Trabajar en un “nivel” en Unity normalmente significa integrar todos los recursos necesarios en una escena y vincularlos mediante componentes y scripts.

El sistema de escenas de Godot es aparentemente similar al de la Unity. Un “nivel” consiste en una colección de nodos, cada uno con su propio propósito: Sprite, Mesh, Light, etc. Sin embargo, en Godot los nodos están organizados en árbol. Cada nodo puede tener varios hijos, lo que hace de cada uno una subescena de la escena principal. Esto significa que puedes crear una escena completa a partir de diferentes escenas guardadas en diferentes archivos.

Por ejemplo, piensa en un nivel de un juego de plataformas. Verías que está compuesto de múltiples elementos:

  • Bloques
  • Mondedas
  • El jugador
  • Los enemigos

En Unity, pondrías todos los GameObjects en la escena: el jugador, múltiples instancias de enemigos, bloques por todas partes para formar la base del nivel, y múltiples instancias de monedas por todo el nivel. A continuación, se añadirían varios componentes a cada elemento para enlazarlos y añadir lógica en el nivel: por ejemplo, se añadiría un BoxCollider2D a todos los elementos de la escena para que puedan colisionar. Este principio es diferente en Godot.

En Godot, puedes dividir toda tu escena en tres escenas separadas, más pequeñas, e incluirlas en la escena principal.

  1. Una escena sólo para el Player.

Veamos al jugador como un elemento que nos gustaría usar en diferentes escenas padre (por ejemplo, las escenas de “nivel”). En nuestro caso, el elemento jugador necesita al menos un nodo AnimatedSprite. Este nodo contiene las texturas de sprite necesarias para diversas animaciones (por ejemplo, la animación de caminar).

  1. La escena del Enemigo.

Un enemigo también es un elemento que podríamos usar en diversas escenas. Es casi igual que el nodo Player. Las únicas diferencias son el script (necesita rutinas “IA” para generar el comportamiento del enemigo) y las texturas de los sprites que utiliza el nodo AnimatedSprite.

  1. La escena de Nivel.

Una escena de nivel se compone de Bricks (bloques para las plataformas), Coins (monedas para que el jugador las recoja) y una serie de instancias de la escena Enemy. Cada instancia es un nodo en el árbol de escenas del nivel. Estas instancias son enemigos independientes, que inicialmente tienen un comportamiento y apariencia compartidos, tal y como se han definido en la escena Enemy. Puedes establecer diferentes propiedades para cada nodo Enemy (por ejemplo, para cambiar de color).

4. A Main scene. The Main scene would be composed of one root node with 2 children: a Player instance node, and a Level instance node. The root node can be anything, generally a «root» type such as «Node» which is the most global type, or «Node2D» (root type of all 2D-related nodes), «Spatial» (root type of all 3D-related nodes) or «Control» (root type of all GUI-related nodes).

Como puedes ver, cada escena está organizada como un árbol. Lo mismo ocurre con las propiedades de los nodos: no se añade un componente de colisión a un nodo para hacerlo colisionable como lo hace Unity. En su lugar, este nodo se convierte en hijo de un nuevo nodo específico que tiene propiedades de colisión. Godot dispone de varios tipos de nodos de colisión, dependiendo del uso (ver Physics introduction).

  • ¿Cuáles son las ventajas de este sistema? ¿Este sistema no aumentaría potencialmente la profundidad del árbol de la escenas? ¿Y Unity no permite ya organizar GameObjects poniéndolos dentro de GameObjects vacíos?

    • El sistema de Godot está más cerca del conocido paradigma orientado a objetos: Godot proporciona una serie de nodos que no son claramente «Objetos de Juego», pero que proporcionan a sus hijos sus propias capacidades: esto es herencia.
    • Godot permite la extracción de un subárbol de una escena para convertirla en una escena propia. Así que si un árbol de escena se hace demasiado profundo, puede dividirse en subárboles más pequeños. Esto es mejor para la reutilización, ya que se puede incluir cualquier subárbol como hijo de cualquier nodo. Poner varios GameObjects en un GameObject vacío en Unity no proporciona la misma funcionalidad.

Organización del proyecto

../../_images/unity-project-organization-example.png

No existe una arquitectura de proyecto perfecta. Se puede hacer que cualquier arquitectura funcione en Unity y Godot.

Sin embargo, es común en los proyectos de Unity tener una carpeta de Assets en el directorio raíz que contiene varias carpetas, una por tipo de activo: Audio, Gráficos, Modelos, Materiales, Scripts, Escenas, etc.

Como Godot permite dividir las escenas en escenas más pequeñas, cada escena y subescena existe como un archivo en el proyecto, por lo tanto, se recomienda organizar el proyecto de una manera un poco diferente. Este wiki proporciona información al respecto: Organización del proyecto.

¿Dónde están mis prefabs?

Un prefabricado proporcionado por Unity es un elemento “plantilla” de la escena. Es reutilizable, y cada instancia del prefabricado que existe en la escena tiene una existencia propia, pero todos tienen las mismas propiedades definidas por el prefabricado.

Godot no proporciona prefabs como tales, pero esta funcionalidad se encuentra disponible gracias al sistema de escenas: como vimos el sistema de escenas está organizado como un árbol. Godot permite guardar un subárbol de una escena como una escena propia, guardada en su propio archivo. Esta nueva escena puede ser instanciada tantas veces como se desee. Cualquier cambio que se realice en esta nueva escena separada se aplicará a sus instancias. Sin embargo, cualquier cambio que se realice en la instancia no tendrá ningún impacto en la escena `plantilla”.

../../_images/save-branch-as-scene.png

Para ser precisos, puede modificar los parámetros de una instancia en el panel Inspector. Los nodos que componen esta instancia están inicialmente bloqueados. Puede desbloquearlos si lo necesita haciendo clic derecho en la instancia en el árbol de escena y seleccionando » Hijos Editables » en el menú. No necesita hacer esto para agregar * nuevos * nodos secundarios a este nodo. Recuerde que los nuevos hijos pertenecerán a la instancia, no a la escena “plantilla” en el disco. Si desea agregar nuevos hijos a cada instancia de su escena “plantilla”, entonces debe agregarlos en la escena “plantilla”.

../../_images/editable-children.png

Correspondencia del glosario

  • GameObject -> Nodo
  • Add a component -> Heredar
  • Prefab -> Archivo de escena reusable

Scripting: GDScript, C# y Visual Script

Diseño

Como ya sabrás, «Unity soporta C#» y se beneficia de su integración con Visual Studio y otras características, como el tipado estático.

Godot proporciona su propio lenguaje de secuencias de comandos: ref: GDScript <doc_scripting> y también admite: ref: Visual Script <toc-learn-scripting-visual_script> y: ref: C # <doc_c_sharp>. GDScript toma prestada su sintaxis de Python, pero no está relacionada con ella. Si se pregunta sobre el razonamiento de un lenguaje de script personalizado, lea las páginas: ref: doc_gdscript y: ref:` doc_faq`. GDScript está fuertemente vinculado a la API de Godot y no tarda mucho en aprender: entre una noche para un programador experimentado y una semana para un principiante completo.

Unity te permite adjuntar tantos scripts como quieras a un GameObject. Cada script añade un comportamiento al GameObject: por ejemplo, se puede adjuntar un script para que reaccione a los controles del jugador y otro para que controle su lógica de juego específica.

En Godot, sólo puedes adjuntar un script por nodo. Se puede utilizar un archivo GDScript externo o incluirlo directamente en el nodo. Si necesitas adjuntar más scripts a un nodo, entonces puedes considerar dos soluciones, dependiendo de tu escena y de lo que quieras lograr:

  • puedes añadir un nuevo nodo entre tu nodo de destino y su padre actual, y luego añadir un script a este nuevo nodo.
  • o bien, puedes dividir tu nodo objetivo en varios hijos y adjuntar un script a cada uno de ellos.

Como puede ver, puede ser fácil convertir un árbol de escena en un desastre. Considere dividir cualquier escena complicada en varias ramas más pequeñas.

Conexiones: grupos y señales

Puedes controlar los nodos accediendo a ellos mediante un script y llamando a funciones incorporadas o definidas por el usuario. También es posible colocar nodos en un grupo y llamar funciones en todos los nodos de este grupo. Ver más en la documentación de scripting.

Los nodos pueden enviar una señal cuando ocurre una acción especificada. Se puede configurar una señal para llamar a cualquier función. Puedes definir señales personalizadas y especificar cuándo se activan. Ver más en la documentación de señales.

Serialización de scripts

Unity puede manejar la serialización de scripts de dos maneras:

  • Implícita: todos los campos públicos en una clase se serializan automáticamente si el tipo es un tipo serializable (Dictionary no es serializable).
  • Explícita: los campos no públicos se pueden serializar usando el atributo [SerializeField].

Godot también tiene un sistema integrado de serialización de scripts, pero funciona solo explícitamente. Puede serializar cualquier tipo serializable (incorporado y varios tipos de motores, incluyendo ref:class_Array y:ref:class_Dictionary) usando la palabra clave export. Consulte la:ref:documentación de exportaciones <doc_gdscript_exports> para obtener más información.

Unity también tiene un tipo de datos llamado ScriptableObject que se utiliza para serializar objetos de recursos personalizados. Su equivalente en Godot es la clase base para todos los recursos: ref:class_Resource. Crear un script que herede class_Resource te permitirá crear objetos personalizados serializables. Se puede encontrar más información sobre los recursos aquí.

Usando Godot en C++

Godot te permite desarrollar tu proyecto directamente en C++ utilizando su API, lo que no es posible con Unity en este momento. Por ejemplo, puedes considerar el editor de Godot Engine como un «juego» escrito en C++ usando la API de Godot.

Si estás interesado en usar Godot en C++, puedes empezar a leer la página Desarrollando en C++.