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

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

`В Godot 4.0 из ядра будет убрана поддержка VisualScript.<https://godotengine.org/article/godot-4-will-discontinue-visual-scripting>`__Так, создание новых проектов с использованием визуального программирования не рекомендуется. В будущем VisualScript может быть интегрирован в Godot 4.x только как расширение.

Пока что Godot 3.x поддерживает VisualScript, но рекомендуется использовать GDScript, особенно если планируется дальнейший переход проекта на 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