自定視覺腳本節點

警告

Godot 4.0 will remove VisualScript from core entirely. As a result, creating new projects using visual scripting in Godot is not recommended. Future Godot 4.x releases may have VisualScript reimplemented as an extension.

While Godot 3.x will keep VisualScript supported, we recommend trying out GDScript instead, especially if you intend to migrate your project to Godot 4.

可以使用 GDScript 撰寫自定節點,並於視覺腳本內使用。可以用來將複雜的程式碼移至 GDScript 中並重複使用。

建立自定節點

建立一個繼承 VisualScriptCustomNode 的新腳本,並在腳本最上方加上 tool 關鍵字。需要加上 tool 是因為要讓腳本能在編輯器中執行。

有一些能實作來設定自定節點參數的函式。只需要在有必要時加上函式就好了,舉例來說,若 _has_input_sequence_port 應該回傳 false 的話就不需要實作。

自定節點中最重要的部分就是 _step 函式。節點的邏輯就定義在 _step 中。

inputs 參數包含了輸入連接埠的值。

outputs 參數為一個陣列,其中的索引值代表輸出的連接埠 ID。可以修改 outputs 來設定輸出連接埠的值。

start_mode 可以用來確認是否為第一次呼叫 _step

working_mem 在各個 _step 間保持不變。可以用來儲存資訊。

若想拋出錯誤,如輸入類型不正確時,可以回傳字串格式的錯誤訊息。若沒問題的話,則回傳下一個要呼叫的序列埠 ID。若自定節點沒有下一個要呼叫的節點的話,則回傳 0。

範例:

tool
extends VisualScriptCustomNode

# The name of the custom node as it appears in the search.
func _get_caption():
    return "Get Input Direction 2D"

func _get_category():
    return "Input"

# The text displayed after the input port / sequence arrow.
func _get_text():
    return ""

func _get_input_value_port_count():
    return 0

# The types of the inputs per index starting from 0.
func _get_input_value_port_type(idx):
    return TYPE_OBJECT

func _get_output_value_port_count():
    return 1

# The types of outputs per index starting from 0.
func _get_output_value_port_type(idx):
    return TYPE_VECTOR2

# The text displayed before each output node per index.
func _get_output_value_port_name(idx):
    return "Direction"

func _has_input_sequence_port():
    return true

# The number of output sequence ports to use
# (has to be at least one if you have an input sequence port).
func _get_output_sequence_port_count():
    return 1

func _step(inputs, outputs, start_mode, working_mem):
    # start_mode can be checked to see if it is the first time _step is called.
    # This is useful if you only want to do an operation once.

    # working_memory is persistent between _step calls.

    # The inputs array contains the value of the input ports.

    var x = int(Input.is_action_pressed("ui_right")) - int(Input.is_action_pressed("ui_left"))
    var y = int(Input.is_action_pressed("ui_down")) - int(Input.is_action_pressed("ui_up"))

    # The outputs array is used to set the data of the output ports.

    outputs[0] = Vector2(x, y)

    # Return the error string if an error occurred, else the id of the next sequence port.
    return 0

使用自定節點

要使用自定節點腳本,新增一個 CustomNode ,選擇 CustomNode 並將節點腳本拖移至屬性面板中的 script 屬性中。

../../../_images/visual_script_custom_node_set_script.png

結果:

../../../_images/visual_script_custom_node_result.png