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.
Resultado: