Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Scene Node 場景節點

前言

使用“get_node()”從腳本引用節點有時可能很脆弱。如果將 UI 場景中的按鈕從一個面板移動到另一個面板,按鈕的節點路徑會發生變化,並且如果腳本使用具有硬編碼節點路徑的“get_node()”,則腳本將無法找到按鈕不再。

在類似這樣的情況下,可以將節點設為場景唯一節點,這樣修改路徑後就不必去修改腳本了。

建立內容

在場景樹面板中,按右鍵節點並在本文功能表中選擇**作為場景唯一名稱存取**。

../../_images/unique_name.webp

勾選後,該節點在場景樹中會在名稱旁邊顯示一個百分號(%):

../../_images/percent.webp

現在您可以在腳本中使用該節點。例如,您可以透過鍵入 % 符號,後面跟著節點名稱,透過「get_node()」方法呼叫來引用它:

get_node("%RedButton").text = "Hello"
%RedButton.text = "Hello" # Shorter syntax

著色器語言限制

場景唯一節點只能由同一場景內的節點檢索。為了示範此限制,請考慮以下範例 Player 場景,該場景實例化 Sword 場景:

../../_images/unique_name_scene_instance_example.webp

以下是 Player 腳本內的 get_node() 呼叫的結果:

  • get_node("%Eyes") 傳回 Eyes 節點。

  • get_node("%Hilt") 回傳``null``。

These are the results of get_node() calls inside the Sword script:

  • get_node("%Eyes") 回傳``null``。

  • get_node("%Hilt") 回傳 Hilt 節點。

如果腳本可以存取另一個場景中的節點,它可以在該節點上呼叫「get_node()」以從該節點的場景中取得場景唯一節點。這也適用於節點路徑,避免多次呼叫“get_node()”。以下是使用場景唯一節點從 Player 腳本取得 Hilt 節點的兩種方法:

  • get_node("Hand/Sword").get_node("%Hilt") 傳回 Hilt 節點。

  • get_node("Hand/Sword/%Hilt") 也回傳 Hilt 節點。

場景唯一名稱不僅適用於節點路徑的末端。它們可以在中間使用,從一個節點導覽到另一個節點。例如,Sword 節點被標記為 Player 場景中的場景唯一節點,因此這是可能的:

  • get_node("%Sword/%Hilt") 回傳 Hilt 節點。

額外檔案

場景唯一節點是導覽場景的有用工具。然而,在某些情況下,其他技術可能會更好。

群組 <doc_groups>` 允許從任何其他節點定位一個節點(或一組許多節點),無論這兩個節點位於哪個場景。

Singleton (Autoload) <doc_singletons_autoload>` 是一個始終載入的節點,無論場景如何,任何節點都可以直接存取它。當某些資料或功能在全球範圍內共享時,這些功能非常有用。

Node.find_child() 透過名稱尋找節點,而不知道其完整路徑。這看起來類似於場景唯一節點,但這種方法能夠在巢狀場景中尋找節點,並且不需要以任何方式在場景編輯器中標記節點。然而,這種方法很慢。場景唯一節點由 Godot 快取,並且可以快速檢索,但每次呼叫該方法時,find_child() 都需要檢查每個後代(每個孩子、孫子等)。