Nodi univoci di scena
Introduzione
Using get_node() to reference nodes from a script can sometimes be fragile.
If you move a button in a UI scene from one panel to another, the button's node
path changes, and if a script uses get_node() with a hard-coded node path,
the script will not be able to find the button anymore.
In situations like this, the node can be turned into a scene unique node to avoid having to update the script every time the node's path is changed.
Creazione e utilizzo
Ci sono due modi per creare un nodo univoco di scena.
In the Scene tree dock, right-click on a node and select Access as Unique Name in the context menu.
After selecting the option, the node will now have a percent symbol (%) next to its name in the scene tree:
You can also do this while renaming the node by adding "%" to the beginning of the name. Once you confirm, the percent symbol will appear next to its name.
You can now use the node in your script. For example, you can reference it with
a get_node() method call by typing the % symbol, followed by the node's
name:
get_node("%RedButton").text = "Hello"
%RedButton.text = "Hello" # Shorter syntax
GetNode<Button>("%RedButton").Text = "Hello";
Limite della stessa scena
A scene unique node can only be retrieved by a node inside the same scene. To demonstrate this limitation, consider this example Player scene that instances a Sword scene:
Ecco i risultati delle chiamate a get_node() all'interno dello script Player:
get_node("%Eyes")restituisce il nodo Eyes.get_node("%Hilt")restituiscenull.
Questi sono i risultati delle chiamate a get_node() all'interno dello script Sword:
get_node("%Eyes")restituiscenull.get_node("%Hilt")restituisce il nodo Hilt.
Se uno script ha accesso a un nodo in un'altra scena, può chiamare get_node() su quel nodo per ottenere nodi univoci dalla scena di quel nodo. Questo funziona anche in un percorso di nodo, evitando più chiamate a get_node(). Ecco due modi per ottenere il nodo Hilt dallo script Player tramite nodi univoci:
get_node("Hand/Sword").get_node("%Hilt")restituisce il nodo Hilt.get_node("Hand/Sword/%Hilt")restituisce egualmente il nodo Hilt.
I nomi univoci delle scene non funzionano solo alla fine di un percorso di nodi. Si possono usare anche al centro per navigare da un nodo all'altro. Ad esempio, il nodo Sword è segnato come nodo univoco nella scena Player, quindi il seguente è possibile:
get_node("%Sword/%Hilt")restituisce il nodo Hilt.
Alternative
I nodi univoci delle scene sono uno strumento utile per navigare in una scena. Tuttavia, ci sono alcune situazioni in cui altre tecniche potrebbero essere migliori.
Un gruppo consente di individuare un nodo (o un gruppo di molti nodi) da qualsiasi altro nodo, a prescindere dalla scena in cui si trovano i due nodi.
Un singleton (autoload) è un nodo sempre caricato a cui è possibile accedere direttamente da qualsiasi nodo, a prescindere dalla scena. Sono utili quando alcuni dati o funzionalità sono condivisi globalmente.
Node.find_child() trova un nodo per nome senza conoscerne il percorso completo. Sembra simile a un nodo univoco, ma questo metodo è in grado di trovare nodi in scene annidate e non richiede in alcun modo di segnare il nodo nell'editor di scene. Tuttavia, questo metodo è lento. I nodi univoci delle scene sono memorizzati nella cache da Godot e sono veloci da recuperare, ma ogni volta che il metodo viene chiamato, find_child() deve verificare ogni discendente (ogni figlio, nipote e così via).