Crear instancias

Nota

Este tutorial trata sobre la instanciación de escenas en el editor. Para aprender a instanciar escenas desde el código, véase Nodos y instancias de escenas.

El enfoque de Godot para la instanciación descrito a continuación no debe confundirse con la instanciación por hardware, que permite renderizar rápidamente grandes cantidades de objetos similares. Véase Optimización usando MultiMeshes.

En la parte anterior, vimos que una escena es una colección de nodos organizados en una estructura de árbol, con un solo nodo como raíz. Puedes dividir tu proyecto en cualquier número de escenas. Esta función te ayuda a desglosar y organizar los diferentes componentes de tu juego.

Puedes crear tantas escenas como desees y guardarlas en el disco con la extensión .tscn, que significa "escena en texto". El archivo label.tscn de la lección anterior fue un ejemplo. Llamamos a esos archivos "Escenas empaquetadas", ya que contienen información sobre el contenido de su escena.

Aquí está el ejemplo de una pelota. Está compuesto por un nodo RigidBody2D como raíz llamado Ball, que permite que la bola caiga y rebote en las paredes, un nodo Sprite2D y un CollisionShape2D.

../../_images/instancing_ball_scene.webp

Una vez guardada una escena, esta funciona como una plantilla: puedes reproducirla en otras escenas tantas veces como desees. Replicar un objeto a partir de una plantilla de este tipo se denomina instanciación.

../../_images/instancing_ball_instances_example.webp

Como mencionamos en la parte anterior, las escenas instanciadas se comportan como un nodo: el editor oculta su contenido por defecto. Cuando crea una instancia de Ball, solo ve el nodo Ball. Observa también cómo cada duplicado tiene un nombre único.

Cada instancia de la escena Ball comienza con la misma estructura y propiedades que ball.tscn. Sin embargo, puedes modificar cada una independientemente, como cambiar cómo rebotan, qué tan pesadas son o cualquier propiedad expuesta por la escena de origen.

En la práctica

Usemos instanciación en la práctica para ver cómo funciona en Godot. Invitamos a descargar el proyecto de muestra de la pelota que preparamos para tí instancing_starter.zip.

Extract the archive on your computer. To import it, you need the Project Manager. The Project Manager is accessed by opening Godot, or if you already have Godot opened, click on Project > Quit to Project List (Ctrl + Shift + Q, Ctrl + Option + Cmd + Q on macOS)

In the Project Manager, click the Import button to import the project.

../../_images/instancing_import_button.webp

En la ventana emergente, haz clic en el botón Examinar y navegue hasta la carpeta que extrajo.

../../_images/instancing_import_project_file.webp

Finally, click the Import button.

../../_images/instancing_import_and_edit_button.webp

A window notifying you that the project was last opened in an older Godot version may appear. That's not an issue. Click OK to open the project.

El proyecto contiene dos escenas empaquetadas: main.tscn, que contiene paredes contra las que choca la pelota, y ball.tscn. La escena Main debería abrirse automáticamente. Si ves una escena 3D vacía en lugar de la escena principal, haz clic en el botón 2D en la parte superior de la pantalla.

../../_images/instancing_2d_scene_select.webp ../../_images/instancing_main_scene.webp

Agreguemos una bola como elemento secundario del nodo Main. En el panel Escena, selecciona el nodo Main. Luego, haz clic en el icono de enlace en la parte superior del panel de escena. Este botón te permite agregar una instancia de una escena como elemento secundario del nodo seleccionado actualmente.

../../_images/instancing_scene_link_button.webp

Haz doble clic en la escena de la pelota para instanciarla.

../../_images/instancing_instance_child_window.webp

La pelota aparece en la esquina superior izquierda de la ventana gráfica.

../../_images/instancing_ball_instanced.webp

Haz clic en ella y arrástrala hacia el centro de la vista.

../../_images/instancing_ball_moved.webp

Ejecuta el juego presionando F5 (Cmd + B en macOS). Deberías verla caer.

Ahora, queremos crear más instancias del nodo Ball. Con la pelota aún seleccionada, presiona Ctrl-D (Cmd-D en macOS) para llamar al comando de duplicación. Haz clic y arrastra para mover la nueva pelota a una ubicación diferente.

../../_images/instancing_ball_duplicated.webp

Puedes repetir este proceso hasta que tenga varias en la escena.

../../_images/instancing_main_scene_with_balls.webp

Ejecuta el juego de nuevo. Ahora deberías ver que cada pelota cae independientemente una de la otra. Esto es lo que hacen las instancias. Cada una es una reproducción independiente de una escena de plantilla.

Edición de escenas e instancias

Hay más en las instancias. Con esta función, puedes:

  1. Change the properties of one ball without affecting the others using the Inspector.

  2. Cambia las propiedades predeterminadas de cada pelota abriendo la escena ball.tscn y haciendo un cambio en el nodo Ball. Al guardar, todas las instancias de Ball en el proyecto tendrán sus valores actualizados.

Nota

Cambiar una propiedad en una instancia siempre sobrescribe los valores de la escena empaquetada correspondiente.

Intentemos esto. Haz doble clic en el archivo ball.tscn en el panel de Sistema de Archivos para abrirlo.

../../_images/instancing_ball_scene_open.webp

In the Scene dock on the left, select the Ball node. Then, in the Inspector on the right, click on the PhysicsMaterial property to expand it.

../../_images/instancing_physics_material_expand.webp

Cambia su propiedad Bounce a 0.5 haciendo clic en el campo numérico, escribiendo 0.5 y presionando Enter.

../../_images/instancing_property_bounce_updated.webp

Play the game by pressing F5 (Cmd + B on macOS) and notice how all balls now bounce a lot more. As the Ball scene is a template for all instances, modifying it and saving causes all instances to update accordingly.

Ahora ajustemos una instancia individual. Regrese a la escena principal haciendo clic en la pestaña correspondiente sobre la ventana gráfica.

../../_images/instancing_scene_tabs.webp

Select one of the instanced Ball nodes and, in the Inspector, set its Gravity Scale value to 10.

../../_images/instancing_property_gravity_scale.webp

Aparece un botón gris "revertir" junto a la propiedad ajustada.

../../_images/instancing_property_revert_icon.webp

Este icono indica que está anulando un valor de la escena empaquetada de origen. Incluso si modifica la propiedad en la escena original, la anulación del valor se conservará en la instancia. Al hacer clic en el icono de reversión, se restaurará la propiedad al valor de la escena guardada.

Vuelva a ejecutar el juego y observe cómo esta bola ahora cae mucho más rápido que las otras.

Nota

You may notice you are unable to change the values of the PhysicsMaterial of the ball. This is because PhysicsMaterial is a resource, and needs to be made unique before you can edit it in a scene that is linking to its original scene. To make a resource unique for one instance, right-click on the Physics Material property in the Inspector and click Make Unique in the context menu.

Los recursos son otro bloque de construcción esencial de los juegos de Godot que cubriremos en una lección posterior.

Instancias de escena como lenguaje de diseño

Las instancias y escenas en Godot ofrecen un excelente lenguaje de diseño, lo que diferencia al motor de los demás. Diseñamos a Godot en torno a este concepto desde cero.

Recomendamos descartar los patrones de código arquitectónico al hacer juegos con Godot, como los diagramas Modelo-Vista-Controlador (MVC) o Entidad-Relación. En su lugar, puedes comenzar imaginando los elementos que los jugadores verán en tu juego y estructurar su código en torno a ellos.

Por ejemplo, podrías desglosar un juego de disparos así:

../../_images/instancing_diagram_shooter.png

You can come up with a diagram like this for almost any type of game. Each rectangle represents an entity that's visible in the game from the player's perspective. The arrows point towards the instantiator of each scene.

Una vez que tengas un diagrama, recomendamos crear una escena para cada elemento listado en él para desarrollar tu juego. Utilizarás instanciación, ya sea por código o directamente en el editor para construir tu árbol de escenas.

Los programadores tienden a pasar mucho tiempo diseñando arquitecturas abstractas y tratando de encajar componentes en ellas. El diseño basado en escenas hace que el desarrollo sea más rápido y sencillo, lo que te permite concentrarse en la lógica del juego en sí. Debido a que la mayoría de los componentes del juego se asignan directamente a una escena, el uso de un diseño basado en la creación de instancias de escena significa que necesita poco más código arquitectónico.

Aquí está el ejemplo de un diagrama de escena para un juego de mundo abierto con toneladas de activos y elementos anidados:

../../_images/instancing_diagram_open_world.png

Imagina que comenzamos creando la habitación. Podríamos hacer un par de escenas de habitaciones diferentes, con arreglos únicos de muebles en ellas. Más tarde, podríamos hacer una escena de casa que use instancias de varias habitaciones para el interior. Crearíamos una ciudadela a partir de muchas casas instanciadas y un gran terreno en el que colocaríamos la ciudadela. Cada uno de estos sería una escena que ejemplifica una o más sub-escenas.

Más tarde, podríamos crear escenas que representaran a los guardias y agregarlos a la ciudadela. Se agregarían indirectamente al mundo general del juego.

Con Godot, es fácil iterar en tu juego de esta manera, ya que todo lo que necesitas hacer es crear e instanciar más escenas. Diseñamos el editor para que fuera accesible a programadores, diseñadores y artistas por igual. Un proceso típico de desarrollo en equipo puede involucrar a artistas 2D o 3D, diseñadores de niveles, diseñadores de juegos y animadores, todos trabajando con el editor Godot.

Resumen

La creación de instancias, el proceso de producción de un objeto a partir de una guía/descripción, tiene muchos usos prácticos. Con escenas, te permite:

  • La habilidad para dividir tu juego en componentes reutilizables.

  • Una herramienta para estructurar y encapsular sistemas complejos.

  • Un lenguaje para pensar en la estructura de tu proyecto de juego de forma natural.