節點與術語

在繼續之前,我們必須先瞭解 節點 這個術語要怎麼使用。當我們講 視覺腳本節點 (或一般講 節點),則代表圖表上那些小盒子,可以用線段來連接。而講 場景節點 則指的是構成場景的元素,屬於場景樹的一部分。這兩個名稱很類似,但功能不同。當我們在這裡說 節點 ,除非有特別說明,否則都是指 視覺腳本節點

../../../_images/visual_script16.png

節點屬性

與其他大部分視覺腳本實作一樣,每個節點都有可編輯的屬性。但在 Godot 中,我們希望避免用可編輯的控制元件來讓節點變得複雜而難以閱讀。

節點依然會將需要的資訊顯示為文字,但編輯是通過 屬性面板 來做的。要編輯屬性,先選擇任意節點並在 屬性面板 中編輯屬性。

連接埠與連線

在 Godot 視覺腳本中進行程式設計是通過各個函式的 節點連接埠連線 來完成的。

連接埠

在 Godot 視覺腳本中的節點有 連接埠 。連接埠是顯示在節點左右兩側的端點,可以用來建立 連線 。有兩種類型的 連接埠序列資料

../../../_images/visual_script17.png

序列埠 用來表示執行操作的順序。通常當 節點 完成處理後,該節點會從右邊的其中一個連接埠繼續執行下一個節點。若沒有連接任何節點,則函式會結束執行,或試著輸出到另一個 序列埠 (依據節點而有所不同)。因此,只需要跟著白色線即代表韓世忠的邏輯流程。並非所有 節點 都有 序列埠 ,而事實上大部分節點都沒有。

資料埠 包含了特定型別的數值。數值的型別可以是任何一般 Godot 型別,如布林、整數、字串、Vector3、陣列、物件或場景節點…等。在節點右側的 資料埠 可以當作輸出,而左側的連接埠則是輸入。通過連接這些連接埠可以用來讓資訊從一個節點流動到下一個節點。

但並非所有 資料埠 都互相相容以及可連接。請注意看色彩與圖示,每個型別都有不同的顯示方式:

../../../_images/visual_script18.png

連接

連接連接埠則是相對簡單。拖移 輸出連接埠輸入連接埠

../../../_images/visual_script_connect.gif

斷開連接則需要一點練習。要斷開連接 資料埠 需要把 輸入 拖移走,而 序列埠 則是將 輸出 拖移走。

../../../_images/visual_script_disconnect.gif

一開始看這個方式可能有點奇怪,但會這麼設計是因為 資料埠 為 1:N (單一輸出連接埠可以連接到多個輸入),而 序列埠 則為 N:1 (多個序列輸出可以連接到單一輸入)。

連接到空白區域 (拖移來連接後在空白區域放開) 也與上下文有關,放開後會列出常用操作。序列埠會顯示條件節點:

../../../_images/visual_script52.png

而資料埠則會開啟設定/取得/呼叫的上下文選單:

../../../_images/visual_script53.png

新增節點

最後!到了最有趣的部分了!但是,在詳細解釋各型別節點的功能前,先來看看節點通常是怎麼新增以及如何處理節點的。

存取場景節點

最常見的任務之一就是存取場景樹節點了 (不要與 視覺腳本節點 搞混了)。從場景樹拖移過來並在畫布上放開,會詢問是否要在節點上 呼叫方法 (有時也稱為 成員函式)。

../../../_images/visual_script19.png

雖然大多數情況下我們都是要存取屬性 (詳細請見下方),但有時 呼叫方法 也很實用。方法是用來對物件執行特定的操作。在上圖例子中,可以將滑鼠遊標包裝到控制元件 (按鈕) 的指定座標位置上。另一個常見的呼叫方法用途則是使用 queue_free 方法將刪除節點排入佇列。

../../../_images/visual_script20.png

請注意,這種做法只能在編輯中場景的其中一個節點有包含 視覺腳本 時才可以用!否則會顯示警告。

存取場景節點屬性

這是在視覺腳本中編輯 場景節點 最常見的方法。從 場景樹 中選擇一個 場景節點 ,然後在屬性面板中找到要編輯的屬性 名稱 (而不是 ),並將名稱拖移至畫布上:

../../../_images/visual_script21.png

之後這個至便可以通過寫入 資料埠 來從腳本內修改。

若不是要編輯值而是讀取值,則可以在拖移節點時按住 Ctrl (或 macOS 上 Cmd ),就可以建立 Getter:

../../../_images/visual_script22.png

這樣一來便能從 資料埠 來讀取值。

變數

變數是一種能保存數值的記憶體容器,對於腳本來說是區域性的。變數值可以從腳本中任何函式讀取,或是通過由上一個步驟中說民的方法來從其他腳本讀取。

要新增變數,點擊 [成員] 面板中的 [變數] 分類下點擊 [+] 按鈕。點兩下新變數名稱來重新命名:

../../../_images/visual_script23.png

右鍵點擊變數便可設定變數屬性:

../../../_images/visual_script24.png ../../../_images/visual_script25.png

就像上面看到的,可以更改變數的型別與初始值以及一些屬性提示。點擊 [匯出] 選項可以讓變數在選擇節點時出現在屬性面板中。也可以讓其他腳本能通過上一個步驟中說明的方法來使用這個變數。

../../../_images/visual_script28.png

要在腳本中使用變數,只需要將變數拖移到畫布上就能建立 Getter:

../../../_images/visual_script26.png

同樣地,按住 Ctrl (或 macOS 上 Cmd) 即可放置 Setter:

../../../_images/visual_script27.png

訊號

也可以在腳本中建立自定訊號並使用。為此,只需要重複上一個步驟中相同,但這次選擇 訊號

../../../_images/visual_script29.png

訊號也可以在右鍵選單中編輯來自定參數:

../../../_images/visual_script30.png

建立好的訊號會與內建節點訊號一樣出現在屬性面板中。從這裡可以連接訊號到另一個 場景節點 的另一個腳本上:

../../../_images/visual_script31.png

最後,要送出訊號只需要將訊號拖曳到畫布上即可:

../../../_images/visual_script32.png

請記得,送出訊號是有順序的操作,所以必須要從 序列埠 連出來。

新增更多節點

現在我們已經講完基礎了,來說一下可以在畫布上使用的更多公用節點!在成員面板下方有列出所有可用的節點類型:

../../../_images/visual_script33.png

Ctrl + F (或 macOS 上 Cmd + F) 可以搜尋列表。

列表中的所有節點都可以拖移只場景中。與其他節點不同 (如:從屬性面板中拖移屬性說來會自動將上下文設定到正在編輯的節點),列表中的節點在加入時不會加上「上下文」資訊,必須手動設定。

../../../_images/visual_script34.png

請記得,可以從類別參考中瞭解各個節點的功能,類別參考中有文件說明。就像剛才說得,各個節點的簡介如下:

常數

常數節點是用來提供不會隨時間變化的數值,適合用來作為參考值。大多數的時候常數節點都是整數或浮點數。

../../../_images/visual_script36.png

第一個是「常數」,能用來選擇任意類型的任意數值作為常數,不管是整數 (42) 還是字串 ("你好!")。一般來說,因為 資料埠 有預設輸入值,所以不會很常用到常數節點,但知道有這東西還是不錯的。

第二個則是 GlobalConstant 節點,這個節點包含了 Godot 中用於全域型別的常數列表。可以在這個節點中找到用來參照按鍵名稱、搖桿或滑鼠按鈕…等的實用常數。

第三種則是 MathConstant,提供了常見的數學常數,如 PI, E …等。

資料

資料節點用來除了各類的資訊存取。在 Godot 中所有的資訊都是通過這些節點來存取的,所以也是最重要的一些節點,同時也有許多種類。

../../../_images/visual_script37.png

其中有許多種有趣的節點,這裡簡單說明一下:

操作

操作節點在處理從裝置來的輸入時很重要。更多關於操作的說明請參考此處 (@TODO 連結待補)。在下方的範例中,控制元件會在「move_right」操作按下後往右移動。

../../../_images/visual_script38.png

Engine Singleton 引擎單例

引擎單例 (Singleton) 是全域介面 (代表這些介面可以不通過參照來存取,與場景節點不同,這些介面隨時可用)。這些節點有許多功能,但一般來說,這些節點都適合用來存取低階或作業系統相關的功能。

../../../_images/visual_script39.png

記得,將連線拖移到空白出可以呼叫函式或設定/取得屬性:

../../../_images/visual_script40.png

Local Variables 區域變數

這些節點可以用來為圖表作臨時儲存。只要使用相同的名稱與型別,就會參照到相同的記憶體。

../../../_images/visual_script41.png

就像上面看到的,有兩個可用的節點:一個簡單的 Getter 與一個序列 Setter (設定需要有序列埠)。

Scene Node 場景節點

只是參照到場景樹中的節點,但直接從場景樹拖移實際節點到畫布上比用這個節點簡單多了 (直接拖移會建立並設定節點)。

僅自己

在某些罕見的情況下,可能會需要將此節點作為參數傳給場景節點。自身節點可以用來呼叫函式與設定或取得屬性或是為本節點從場景樹拖移節點 (或是有腳本的節點自己) 到畫布上。

SceneTree

自身節點與單例節點很像,因為這兩個節點都是參照到包含有效場景的 SceneTree。但 SceneTree 只在節點位於場景內且有效的情況下可以用,否則存取的時候會回傳錯誤。

SceneTree 允許許多低階的操作,如設定拉伸選項、呼叫群組、建立 Timer 或甚至載入其他場景。建議多瞭解 SceneTree 類別。

Preload 預載

預載節點與 GDScript 中的 preload() 功能相同。該節點可以用來讓載入指定資源並準備好使用。比起實體化節點,從檔案系統拖所需的資源到畫布上還比較簡單。

資源路徑

資源路徑節點只是一個簡單的協助程式,可以用來取得所選資源的路徑字串。當有函數需要從硬碟載入東西時很有用。

Comment 註解

註解節點與節點一樣,可以縮放並放置在其他節點的周圍。當選擇註解節點時,焦點不會跑到註解節點上,也不會跑到最上層。可以在註解上面寫字。

../../../_images/visual_script42.png

Flow Control 流程控制

流程控制節點通常會依據給定的條件,執行不同的分支。

../../../_images/visual_script43.png

Condition 條件

條件是一個很簡單的節點,只用來確認一個布林連接埠。若 true 則會執行「true」序列埠,若 false 則會執行第二個。執行完任一個後,便會繼續執行「done」連接埠。若不是全部的連接埠都有用到的話,也可以不連接序列埠。

Iterator 迭代器

在 Godot 中,有些資料型別 (如陣列、字典) 是可迭代的。可迭代表示能在這些資料型別的每個元素上執行某一段程式碼。

迭代器節點會通過每一個元素,並會將每一個元素都傳到「each」序列埠,然後讓元素能通過「elem」資料埠存取。

迭代結束後將跑到「exit」序列埠。

Return 回傳

有些函式可以回傳數值。一般來說,Godot 會自動為虛擬函式加上回傳節點。回傳節點可以強制函式結束。

Sequance 序列

序列節點適合用來組織圖表。會照順序呼叫序列埠。

TypeCast 型別轉換

TypeCast 是很實用也很常用的節點。可以通過 TypeCast 來將引數或其他物件轉換成想要的型別。之後,還可以拖移物件輸出來完成。

../../../_images/visual_script55.png

也可以將引數轉換為腳本,用來製作完整的腳本屬性與方法:

../../../_images/visual_script54.png

Switch 切換

Switch 節點與 Condition 節點類似,但 Switch 節點會一次配對多個值。

While

While 是比較原始的迭代方法。只要「cond」資料埠中的條件符合,就會一直重複呼叫「repeat」序列輸出。

函式

函式是簡單的輔助程式,大部分情況下都可預測。函數會取得一些引數作為輸入,並回傳輸出。函數通常都沒有序列。

Built-in 內建

內建節點列出了內建輔助程式。這個列表與 GDScript 文件中的幾乎一樣。其中大部分都是數學函式,但還有一些其他很有用的輔助程式。若有空記得去看一下。

By Type 依型別

這些節點是基礎型別用的方法。如,若想計算內積,可以搜尋「dot (點)」而不是 Vector3 分類。大多數情況下,直接搜尋節點列表會比較快。

Call 呼叫

呼叫是通用的呼叫節點。很少會用到這種節點,通常都直接從已設定好的節點拖移到空白處。

Constructors 建置函式

這些節點是用來建立 Godot 基礎資料型別的所有函式。例如,當需要從三個浮點數建立一個 Vector3,就必須使用建置函式。

../../../_images/visual_script44.png

Destructor 解構函式

解構函式與 Contructor 建置函式相反,用來將基礎型別 (如 Vector3) 分離為子元素。

../../../_images/visual_script45.png

Emit Signal 送出訊號

從任意物件送出訊號。通常來說這種節點不是很實用,因為直接把訊號拖移到畫布上比較好。

Get/Set 取值或設值

通用的 Getter 與 Setter 節點。從屬性面板中拖移屬性過來比較好,因為會在放開的時候正確設定。

Wait 等待

Wait 節點會暫停函式的執行,直到某些事情發生 (事實上,在繼續執行之前可以等待好幾幀)。預設節點能用來等待一幀、固定數量的幀或是指定時間後再繼續執行。

Yield

該節點會完全暫停腳本的執行,並讓函式回傳可以用來繼續執行的值。

Yield Signal - Yield 訊號

與 Yield 相同,但會等待到指定訊號送出。

Index - 索引

通用索引運算元,不常使用,但以備不時之需。

運算子

最通用的運算子,如加法、乘法、比較…等。預設情況下,這幾個運算元通常都接受所有資料型別 (而若給的型別不符合運算元的預期,則會在執行時拋出錯誤)。建議給運算子設定正確的型別,以便早期發現問題,並讓圖表更易讀。

../../../_images/visual_script46.png

Expression Node 運算式節點

在所有運算子中,Expression 節點是最強大的。若正確使用,將可以極大地簡化腳本中吃重數學或邏輯的部分。只需要在 Expression 節點上輸入任何的運算式,就能即時執行。

運算式節點可以:

  • 依據自定輸入來執行數理或邏輯運算式 (如「a * 5 + b」,其中 a 與 b 為自定輸入):

../../../_images/visual_script47.png
  • 存取區域變數或屬性:

../../../_images/visual_script48.png
  • 使用大部分 GDScript 中現有的內建函式,如 sin(), cos(), print() 與建置函式,如 Vector3(x, y, z), Rect2(...) …等:

../../../_images/visual_script49.png
  • 呼叫 API 函式:

../../../_images/visual_script50.png
  • 使用序列模式,就可以更妥善處理執行順序:

../../../_images/visual_script51.png