Nodos de VisualScript personalizados

Advertencia

Godot 4.0 eliminará VisualScript de su núcleo por completo. Como resultado, no se recomienda la creación de proyectos con scripts visuales dentro de Godot. Lanzamientos futuros de Godot 4.x podrán tener VisualScript re-implementado como una extensión.

Aunque Godot 3.x mantendrá el soporte de VisualScript, recomendamos que pruebes GDScript en su lugar, especialmente si tienes intención de migrar tu proyecto a Godot 4.

Los nodos personalizados son escritos en GDScript y pueden ser usado luego en VisualScript. Esto es útil para llevar lógica compleja a GDScript y reusarla.

Creando un nodo personalizado

Crea un nuevo script que extienda VisualScriptCustomNode y pon la palabra cave tool al principio. Esto es necesario para que el script se ejecute en el editor.

Existen funciones que pueden ser implementadas para asignar parámetros del nodo personalizado. Sólo agrega las que necesites, funciones _has_input_sequence_port no son necesarias si esta debe retornar false, por ejemplo.

La parte más importante de en nodo personalizado es la función _step. La lógica del nodo es definida allí.

El parámetro inputs contiene valores de los puertos de entrada.

El parámetro outputs es un array donde el índice representa el id de los puertos de salida. Puede ser modificado para asignar valores a los puertos de salida.

start_mode puede ser revisado para ver si es la primera vez que se llamó a _step.

working_mem es persistente para cada llamada a _step. Puede ser usado para guardar información.

Si quieres disparar un error, por ejemplo si el tipo de entrada es incorrecto, puedes retornar el mensaje de error como una cadena. Cuando todo va bien, retorna el id de la secuencia de puertos que debería ser llamado en el siguiente paso. Si tu nodo personalizado no tiene ninguno, sólo retorna 0.

Ejemplo:

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 un nodo personalizado

Para usar el script, agrega un CustomNode, selecciona el script personalizado y arrástralo a la propiedad script que se ve en el inspector.

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

Resultado:

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