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