Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Autoloads frente a nodos corrientes

Godot ofrece una característica para cargar nodos automáticamente en la raíz de tu proyecto, permitiéndote acceder a ellos globalmente, que puede cumplir el rol de un Singleton: Singletons (Autoload). Estos nodos auto-cargados no se liberan cuando cambias la escena desde código con SceneTree.change_scene_to_file.

En esta guía aprenderás cuándo usar la función Autoload, y técnicas que puedes usar para evitarlo.

El problema del audio con cortes

Otros motores pueden fomentar la creación clases gestoras, singletons que organizan mucha funcionalidad en un objeto accesible globalmente. Godot ofrece varias maneras de evitar un estado global gracias al árbol de nodos y las señales.

Por ejemplo, digamos que estamos construyendo un juego de plataformas y queremos recoger monedas que reproducen un efecto de sonido. Hay uno nodo para ello: el AudioStreamPlayer. Pero si llamamos al AudioStreamPlayer mientras ya está reproduciendo un sonido, el nuevo sonido interrumpe al primero.

Un solución es programar una clase gestora global, auto-cargada. Ésta genera un "pool" de nodos AudioStreamPlayer que recorre a medida que llega cada nueva petición de efectos de sonido. Digamos que llamamos esa clase Sound, puedes usarla desde cualquier sitio en tu proyecto llamando a Sound.play("coin_pickup.ogg"). Esto soluciona el problema a corto plazo, pero causa más problemas:

  1. Estado global: Un objeto es ahora responsable de todos los datos de los objetos. Si la clase Sound tiene errores o no tiene un AudioStreamPlayer disponible, todos los nodos que la llaman pueden fallar.

  2. Acceso global: Ahora cualquier objeto puede llamar a Sound.play(sound_path) desde cualquier sitio, ya no hay una forma fácil de encontrar la fuente de un error.

  3. Asignación de recursos global: Con un "pool" de nodos AudioStreamPlayer almacenado desde el principio, puedes tener muy pocos y enfrentarte a errores, o tener demasiados y usar más memoria de la necesaria.

Nota

Acerca del acceso global, el problema es que cualquier código en cualquier sitio podría pasar datos incorrectos al autoload Sound en nuestro ejemplo. Como resultado, el dominio a explorar para arreglar el error abarca todo el proyecto.

Cuando mantienes el código dentro de una escena, solo uno o dos scripts pueden estar involucrados en audio.

Compara esto con cada escena manteniendo tantos nodos AudioStreamPlayer como necesita dentro de sí y todos estos problemas desaparecen:

  1. Cada escena gestiona su propia información de estado. Si hay un problema con los datos, únicamente causará problemas en esa escena.

  2. Cada escena accede solo a sus propios nodos. Ahora, si hay un error, es fácil encontrar qué nodo es el culpable.

  3. Cada escena asigna exactamente la cantidad de recursos que necesita.

Gestionando funcionalidad o datos compartidos

Otra razón para usar un Autoload puede ser que quieras reutilizar el mismo método o dato en varias escenas.

En el caso de funciones, puedes crear un nuevo tipo de Node que proporcione esa característica para una escena individual usando la palabra clave class_name en GDScript.

Cuando se trata de datos, puedes:

  1. Crear un nuevo tipo de Resource para compartir los datos.

  2. Almacenar los datos en un objeto al que cada nodo tiene acceso. Por ejemplo, usado la propiedad owner para acceder al nodo raíz de la escena.

Cuándo deberías usar un Autoload

GDScript soporta la creación de funciones estáticas utilizando static func. Combinado con class_name, permite crear librerías de funciones de utilidad sin necesidad de crear una instancia para llamarlas. La limitación de las funciones estáticas es que estas no pueden acceder a variables miembro, funciones no estáticas o self.

A partir de Godot 4.1, GDScript también soporta variables estáticas usando static var. Esto significa que ahora puedes compartir variables entre instancias de una clase sin tener que crear un autoload por separado.

Aún así, los nodos autocargados pueden simplificar tu código para sistemas con un amplio alcance. Si el singleton está gestionando su propia información sin invadir los datos de otros objetos, entonces es una manera estupenda de crear sistemas que manejen tareas de amplio alcance. Por ejemplo, un sistema de misiones o diálogos.

Nota

Un autoload no es exactamente un Singleton. Nada te impide instanciar copias de un nodo auto-cargado. Sólo es una herramienta que hace que un nodo se cargue automáticamente como un hijo de la raíz de tu árbol de escena, independientemente de la estructura de nodos de tu juego o de qué escenas ejecutes, p.ej. pulsando la tecla F6.

Como resultado, puedes acceder al nodo auto-cargado, por ejemplo un autoload llamado Sound, llamando a get_node("/root/Sound").