Пользовательские узлы 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).
Результат: