Пользовательские узлы VisualScript

Предупреждение

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 и затем могут быть использованы в VisualScript. Это полезно для разгрузки сложного кода в GDScript и повторного его использования.

Создание пользовательского узла

Создайте новый скрипт, который расширяет (extends) VisualScriptCustomNode и поместите ключевое слово tool вверху. Это необходимо для запуска скрипта в Редакторе (Editor).

Есть некоторые функции, которые могут быть реализованы для установки параметров пользовательского узла. Добавляйте только те функции, которые необходимы, например, функция _has_input_sequence_port не нужна, если она должна возвращать false.

Наиболее важной частью пользовательского узла является функция _step. Там определяется логика узла.

Параметр inputs содержит значение входных портов.

Параметр outputs представляет собой массив, в котором индексы представляют идентификаторы выходных портов. Он может быть изменен для установки значений выходных портов.

start_mode может быть проверен, чтобы убедиться, что это первый раз, когда вызывается _step.

working_mem является постоянным при каждом вызове _step. Может использоваться для хранения информации.

Если вы хотите выдать ошибку, например, если входные типы неверны, вы можете вернуть сообщение об ошибке в виде строки. Когда все пойдет правильно, верните идентификатор порта последовательности, который должен быть вызван следующим. Если у вашего пользовательского узла их нет, просто верните 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, выделите его и перетащите свой пользовательский узел-скрипт в свойство script, показанное в Инспекторе (Inspector).

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

Результат:

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