Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Autoload control nodi normali

Godot offre una funzionalità per caricare automaticamente i nodi alla radice del progetto, consentendoti di accedervi globalmente, il che può svolgere il ruolo di un Singleton: Singleton (Autoload). Questi nodi caricati automaticamente non vengono liberati quando si modifica la scena da codice con SceneTree.change_scene_to_file.

In questa guida, imparerai quando utilizzare la funzionalità Autoload e quali sono le tecniche che puoi utilizzare per evitarla.

Il problema dell'audio interrotto

Altri motori potrebbero incoraggiare la creazione di classi "manager", singleton che organizzano numerose funzionalità all'interno di un oggetto accessibile globalmente. Godot offre molti modi per evitare lo stato globale grazie all'albero di nodi e ai segnali.

Ad esempio, supponiamo di voler creare un gioco piattaforme e di voler raccogliere monete che riproducono un effetto sonoro. Esiste un nodo per questo: AudioStreamPlayer. Ma se chiamiamo AudioStreamPlayer mentre sta già riproducendo un suono, il nuovo suono interrompe il primo.

Una soluzione è programmare una classe globale di gestione audio, auto-caricante. Essa genera un pool di nodi AudioStreamPlayer che vengono eseguiti ciclicamente a ogni nuova richiesta di effetti sonori. Supponiamo di chiamare questa classe Sound. È possibile ora utilizzarla da qualsiasi punto del progetto chiamando Sound.play("coin_pickup.ogg"). Questo risolve il problema a breve termine, ma ne causa altri:

  1. Stato globale: un oggetto è ora responsabile dei dati di tutti gli oggetti. Se la classe Sound contiene errori o non ha un AudioStreamPlayer disponibile, tutti i nodi che la chiamano potrebbero non funzionare bene.

  2. Accesso globale: ora che qualsiasi oggetto può chiamare Sound.play(sound_path) da ovunque, non esiste più un modo semplice per trovare la sorgente di un bug.

  3. Assegnazione globale delle risorse: con un pool di nodi AudioStreamPlayer memorizzati fin dall'inizio, potresti averne troppo pochi e riscontrare dei bug, oppure troppi e utilizzare più memoria del necessario.

Nota

Per quanto riguarda l'accesso globale, il problema è che qualsiasi codice, ovunque, potrebbe passare dati errati all'autoload Sound nel nostro esempio. Pertanto, il dominio da esplorare per correggere il bug è propagato all'intero progetto.

Se si mantiene il codice all'interno di una scena, soltanto uno o due script potrebbero essere coinvolti nell'audio.

Confrontando ciò con ogni scena che contiene tutti i nodi AudioStreamPlayer di cui ha bisogno, tutti questi problemi scompaiono:

  1. Ogni scena gestisce le proprie informazioni di stato. Se i dati sono problematici, si verificheranno problemi solo in una scena.

  2. Ogni scena accede solo ai propri nodi. Ora, se c'è un bug, è facile individuare quale nodo è responsabile.

  3. Ogni scena alloca esattamente la quantità di risorse di cui ha bisogno.

Gestire funzionalità o dati condivisi

Un altro motivo per utilizzare un Autoload può essere il desiderio di riutilizzare lo stesso metodo o gli stessi dati attraverso più scene.

Nel caso delle funzioni, è possibile creare un nuovo tipo di Node che fornisca quella funzionalità per una scena individuale, utilizzando la parola chiave class_name in GDScript.

Per quanto riguarda i dati, è possibile:

  1. Creare un nuovo tipo di Resource per condividere i dati.

  2. Memorizzare i dati in un oggetto a cui ogni nodo ha accesso, ad esempio utilizzando la proprietà owner per accedere al nodo radice della scena.

Quando utilizzare un Autoload

GDScript supporta la creazione di funzioni statiche (static) tramite static func. In combinazione con class_name, ciò permette di creare librerie di funzioni ausiliari senza dover creare un'istanza per chiamarle. La limitazione delle funzioni statiche è che non possono fare riferimento a variabili membro, a funzioni non statiche o a self.

A partire da Godot 4.1, GDScript supporta anche le variabili statiche (static) tramite static var. Ciò significa che ora è possibile condividere variabili tra istanze di una classe senza dover creare un autoload separato.

Ciononostante, i nodi auto-caricati possono semplificare il codice per sistemi con un ampio ambito. Se l'autoload gestisce le proprie informazioni senza invadere i dati di altri oggetti, è un ottimo modo per creare sistemi che gestiscono attività a scopo generale. Ad esempio, un sistema di ricerca o di dialogo.

Nota

Un autoload non è necessariamente un singleton. Nulla impedisce di istanziare copie di un nodo auto-caricato. Un autoload è solo uno strumento che carica automaticamente un nodo come figlio della radice dell'albero di scene, indipendentemente dalla struttura dei nodi nel gioco o dalla scena in esecuzione, ad esempio premendo il tasto F6.

Per questa ragione, è possibile ottenere il nodo caricato automaticamente, ad esempio un autoload chiamato Sound, chiamando get_node("/root/Sound").