Nós de VisualScript personalizados

Aviso

`Godot 4.0 vai remover o VisualScript de toda sua base. <https://godotengine.org/article/godot-4-will-discontinue-visual-scripting>`__Como resultado, criar novos projetos utilizando visual script no Godot não é recomendado. Futuras versões do Godot 4.x podem ter o VisualScript reimplementado como uma extensão.

Apesar do Godot 3.x manter o suporte ao VisualScript, recomendamos experimentar GDScript especialmente se você pretende migrar seu projeto para o Godot 4.

Nós personalizados são escritos em GDScript e podem então ser usados em VisualScript. Isto é útil para descarregar código complexo para GDScript e reutilizá-lo.

Criando um nó personalizado

Crie um novo script que estenda VisualScriptCustomNode e coloque uma palavra-chave tool no topo. Isto é necessário para que o script seja executado no editor.

Existem algumas funções que podem ser implementadas para definir parâmetros do nó personalizado. Apenas adicione funções que são necessárias, uma função _has_input_sequence_port não é necessária se ela deve retornar false por exemplo.

A parte mais importante de um nó personalizado é a função _step. A lógica do nó é definida nela.

O parâmetro inputs contém o valor das portas de entrada.

O parâmetro outputs é um array onde os índices representam os ids da porta de saída. Ele pode ser modificado para definir os valores das portas de saída.

start_mode pode ser verificado para ver se é a primeira vez que _step é chamado.

working_mem é persistente a cada chamada _step. Ele pode ser usado para armazenar informações.

Se você quiser lançar um erro, por exemplo, se os tipos de entrada estiverem incorretos, você pode retornar a mensagem de erro como uma string. Quando tudo der certo, retorne o id da porta de sequência que deve ser chamada a seguir. Se o seu nó personalizado não tiver nenhum, apenas retorne 0.

Exemplo:

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

Usando um nó personalizado

Para usar o script, adicione um CustomNode, selecione-o e arraste seu script de nó personalizado para a propriedade script mostrada no inspetor.

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

Resultado:

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