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.

Caricamento nello sfondo

Spesso, i giochi devono caricare le risorse in modo asincrono. Quando si cambia la scena principale del gioco (ad esempio, passando a un nuovo livello), potrebbe essere necessario mostrare una schermata di caricamento con un'indicazione del progresso in corso, oppure caricare risorse in più durante il gioco.

Il metodo standard di caricamento (ResourceLoader.load o il più semplice load di GDScript) blocca il thread, facendo sì che il gioco non risponda mentre la risorsa viene caricata.

Un modo per aggirare questo problema è utilizzare ResourceLoader per caricare le risorse in modo asincrono nei thread in background.

Utilizzo di ResourceLoader

In genere, si mettono in coda le richieste per caricare risorse per un percorso tramite ResourceLoader.load_threaded_request, che verranno poi caricate nei thread in background.

È possibile verificare lo stato con ResourceLoader.load_threaded_get_status. L'avanzamento si può ottenere passando una variabile array tramite progress, che restituirà un array di un solo elemento contenente la percentuale.

Infine, è possibile recuperare le risorse caricate chiamando ResourceLoader.load_threaded_get.

Una volta chiamato load_threaded_get(), la risorsa termina il caricamento in background e verrà restituita immediatamente, oppure il caricamento si bloccherà a questo punto, come farebbe load(). Per garantire che questo non si blocchi, è necessario assicurarsi che ci sia abbastanza tempo tra la richiesta del caricamento e il recupero della risorsa, oppure è necessario controllare lo stato manualmente.

Esempio

Questo esempio mostra come caricare una scena in background. Faremo in modo che un pulsante generi un nemico quando premuto. Il nemico sarà Enemy.tscn, che caricheremo su _ready e istanziamo quando premuto. Il percorso sarà "Enemy.tscn", che si trova in res://Enemy.tscn.

Per prima cosa, avvieremo una richiesta per caricare la risorsa e connetteremo il pulsante:

const ENEMY_SCENE_PATH : String = "Enemy.tscn"

func _ready():
    ResourceLoader.load_threaded_request(ENEMY_SCENE_PATH)
    self.pressed.connect(_on_button_pressed)

Ora _on_button_pressed verrà chiamato quando il pulsante viene premuto. Questo metodo servirà per generare un nemico.

func _on_button_pressed(): # Button was pressed.
    # Obtain the resource now that we need it.
    var enemy_scene = ResourceLoader.load_threaded_get(ENEMY_SCENE_PATH)
    # Instantiate the enemy scene and add it to the current scene.
    var enemy = enemy_scene.instantiate()
    add_child(enemy)