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.

Cambiare le scene manualmente

A volte aiuta avere più controllo su come si scambiano le scene. I nodi figlio di una Viewport renderizzeranno l'immagine che genera. Vale anche per i nodi esterni alla scena "attuale". I Gli autoload rientrano in questa categoria, così come le scene che vengono istanziate e aggiunte all'albero in fase di esecuzione:

var simultaneous_scene = preload("res://levels/level2.tscn").instantiate()

func _add_a_scene_manually():
    # This is like autoloading the scene, only
    # it happens after already loading the main scene.
    get_tree().root.add_child(simultaneous_scene)

Per completare il ciclo e sostituire la nuova scena con quella vecchia, è necessario fare una scelta. Esistono diverse strategie per rimuovere una scena dalla vista della Viewport. I compromessi richiedono di equilibrare tra velocità di operazione e consumo di memoria, nonché tra accesso e integrità dei dati.

  1. Elimina la scena esistente. SceneTree.change_scene_to_file() e SceneTree.change_scene_to_packed() elimineranno immediatamente la scena attuale. È possibile anche eliminare la scena principale. Supponendo che il nome del nodo radice sia "Main", si potrebbe usare get_node("/root/Main").free() per eliminare l'intera scena.

    • Libera la memoria.

      • Pro: la RAM non contiene più un peso morto.

      • Contro: tornare a quella scena ora è più costoso, poiché deve essere ricaricata in memoria (richiede tempo E memoria). Non è un problema se non c'è bisogno di tornarci subito.

      • Contro: non si ha più accesso ai dati di quella scena. Non è un problema se non c'è bisogno di utilizzare quei dati subito.

      • Nota: può essere utile preservare i dati di una scena che sta per essere eliminata riaggiungendo uno o più dei suoi nodi a una scena diversa, o anche direttamente allo SceneTree.

    • L'elaborazione si interrompe.

      • Pro: niente nodi significa niente elaborazione, elaborazione della fisica o gestione degli input. La CPU è disponibile per lavorare sui contenuti della nuova scena.

      • Contro: l'elaborazione e la gestione degli input di quei nodi non funzioneranno più. Non è un problema se usare i dati aggiornati non è necessario.

  2. Nascondi la scena esistente. Cambiando la visibilità o il rilevamento delle collisioni dei nodi, è possibile nascondere l'intero sottoalbero dei nodi dalla prospettiva del giocatore. Usa CanvasItem.hide() per nascondere una scena e CanvasItem.show() per rimostrarla.

    • La memoria esiste ancora.

      • Pro: è comunque possibile accedere ai dati se necessario.

      • Pro: non è necessario spostare altri nodi per salvare i dati.

      • Con: More data is being kept in memory, which will become a problem on memory-sensitive platforms like web or mobile.

    • L'elaborazione continua.

      • Pro: i dati continuano a ricevere aggiornamenti di elaborazione, quindi la scena manterrà aggiornati tutti i dati al suo interno che dipendono dal tempo delta o dai dati dei frame.

      • Pro: i nodi sono comunque membri di gruppi (poiché i gruppi appartengono allo SceneTree).

      • Contro: l'attenzione della CPU è ora divisa tra entrambe le scene. Un carico eccessivo potrebbe ridurre il frame rate. È consigliabile testare le prestazioni durante l'esecuzione per assicurarsi che la piattaforma di destinazione sia in grado di supportare il carico derivante da questo approccio.

  3. Rimuovi la scena esistente dall'albero. Assegna una variabile al nodo radice della scena esistente. Quindi usa Node.remove_child(Node) per staccare l'intera scena dall'albero. Per riattaccarla in seguito, usa Node.add_child(Node).

    • La memoria esiste ancora (pro/contro simili a nasconderla alla vista).

    • L'elaborazione si interrompe (pro/contro simili a eliminarla completamente).

    • Pro: questa variante di "nascondimento" rende molto più facile mostrare/nascondere. Invece di dover potenzialmente tenere traccia di molteplici modifiche alla scena, basta chiamare i metodi add_child/remove_child. Questo è simile a disabilitare gli oggetti di gioco in altri motori.

    • Contro: a differenza nasconderlo soltanto dalla vista, i dati contenuti nella scena diventeranno obsoleti se dipendono dal tempo delta, input, gruppi o altri dati derivati dall'accesso allo SceneTree.

Esistono anche casi in cui si potrebbe desiderare di avere più scene presenti allo stesso tempo, ad esempio aggiungendo un singleton personalizzato in fase di esecuzione o preservando i dati di una scena tra i cambiamenti di scena (aggiungendo la scena al nodo radice).

get_tree().root.add_child(scene)

Un altro caso potrebbe essere visualizzare più scene alla volta attraverso SubViewportContainers. È ottimale per renderizzare contenuti diversi in diverse parti dello schermo (ad esempio, minimappe, multigiocatore a schermo diviso).

Ogni opzione è la più appropriata per diversi carsi, pertanto è necessario esaminare gli effetti di ogni approccio e determinare quale procedura si adatti meglio alla propria situazione specifica.