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.
Checking the stable version of the documentation...
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:
Stato globale: un oggetto è ora responsabile dei dati di tutti gli oggetti. Se la classe
Soundcontiene errori o non ha un AudioStreamPlayer disponibile, tutti i nodi che la chiamano potrebbero non funzionare bene.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.Assegnazione globale delle risorse: con un pool di nodi
AudioStreamPlayermemorizzati 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:
Ogni scena gestisce le proprie informazioni di stato. Se i dati sono problematici, si verificheranno problemi solo in una scena.
Ogni scena accede solo ai propri nodi. Ora, se c'è un bug, è facile individuare quale nodo è responsabile.
Ogni scena alloca esattamente la quantità di risorse di cui ha bisogno.
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").