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...
Manuelles Wechseln von Szenen
Sometimes it helps to have more control over how you swap scenes around. A Viewport's child nodes will render to the image it generates. This holds true even for nodes outside of the "current" scene. Autoloads fall into this category, and also scenes which you instantiate and add to the tree at runtime:
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)
public Node simultaneousScene;
public MyClass()
{
simultaneousScene = ResourceLoader.Load<PackedScene>("res://levels/level2.tscn").Instantiate();
}
public void _AddASceneManually()
{
// This is like autoloading the scene, only
// it happens after already loading the main scene.
GetTree().Root.AddChild(simultaneousScene);
}
To complete the cycle and swap out the new scene with the old one, you have a choice to make. Many strategies exist for removing a scene from view of the Viewport. The tradeoffs involve balancing operation speed and memory consumption, as well as balancing data access and integrity.
Delete the existing scene. SceneTree.change_scene_to_file() and SceneTree.change_scene_to_packed() will delete the current scene immediately. You can also delete the main scene. Assuming the root node's name is "Main", you could do
get_node("/root/Main").free()to delete the whole scene.Der Speicher wird endladen.
Vorteil: RAM wird nicht mehr für die unnötigen Sachen verschwendet.
Nachteil: Die Rückkehr zu dieser Szene ist jetzt teurer, da sie wieder in den Speicher geladen werden muss (benötigt Zeit UND Speicher). Kein Problem, wenn eine baldige Rückkehr nicht erforderlich ist.
Nachteil: Sie haben keinen Zugriff mehr auf die Daten dieser Szene. Kein Problem, wenn die baldige Verwendung dieser Daten nicht erforderlich ist.
Hinweis: Es kann nützlich sein, die Daten in einer bald zu löschenden Szene beizubehalten, indem Sie einen oder mehrere seiner Nodes erneut an eine andere Szene anhängen oder sogar direkt an SceneTree.
Die Prozessierung stoppt.
Pro: No nodes means no processing, physics processing, or input handling. The CPU is available to work on the new scene's contents.
Nachteil: Die Prozessierung und Eingabeverarbeitung dieser Nodes funktioniert nicht mehr. Kein Problem, wenn die Verwendung der aktualisierten Daten nicht erforderlich ist.
Hide the existing scene. By changing the visibility or collision detection of the nodes, you can hide the entire node sub-tree from the player's perspective. Use CanvasItem.hide() to hide a scene and CanvasItem.show() to show it again.
Der Speicher ist noch vorhanden.
Pro: You can still access the data if needed.
Vorteil: Es ist nicht erforderlich, weitere Nodes zu verschieben, um Daten zu speichern.
Con: More data is being kept in memory, which will be become a problem on memory-sensitive platforms like web or mobile.
Die Prozessierung geht weiter.
Pro: Data continues to receive processing updates, so the scene will keep any data within it that relies on delta time or frame data updated.
Vorteil: Nodes sind immer noch Bestandteil von Gruppen (da Gruppen zum Szenenbaum gehören).
Con: The CPU's attention is now divided between both scenes. Too much load could result in low frame rates. You should be sure to test performance as you go to ensure the target platform can support the load from this approach.
Remove the existing scene from the tree. Assign a variable to the existing scene's root node. Then use Node.remove_child(Node) to detach the entire scene from the tree. To attach it later, use Node.add_child(Node).
Memory still exists (similar pros/cons as hiding it from view).
Processing stops (similar pros/cons as deleting it completely).
Pro: This variation of "hiding" it is much easier to show/hide. Rather than potentially keeping track of multiple changes to the scene, you only need to call the add/remove_child methods. This is similar to disabling game objects in other engines.
Nachteil: Anders als beim Ausblenden mittels Sichtbarkeit werden die in der Szene enthaltenen Daten nicht aktualisiert, wenn sie auf Delta-Zeit, Eingaben, Gruppen oder anderen vom Szenenbaum abgeleiteten Daten beruhen.
There are also cases where you may wish to have many scenes present at the same time, such as adding your own singleton at runtime, or preserving a scene's data between scene changes (adding the scene to the root node).
get_tree().root.add_child(scene)
GetTree().Root.AddChild(scene);
Another case may be displaying multiple scenes at the same time using SubViewportContainers. This is optimal for rendering different content in different parts of the screen (e.g. minimaps, split-screen multiplayer).
Each option will have cases where it is best appropriate, so you must examine the effects of each approach, and determine what path best fits your unique situation.