12/06/2012
¡Bienvenido al fascinante mundo del desarrollo de videojuegos con Godot Engine! Si alguna vez te has preguntado cómo los personajes se mueven, cómo los menús responden a tus clics o cómo se desencadenan los eventos en un juego, la respuesta está en el scripting. El script es el cerebro detrás de la acción, el alma que da vida a los elementos visuales de tu juego. En esta guía completa, te llevaremos de la mano para que crees tu primera escena interactiva desde cero. No te preocupes si eres nuevo en esto; explicaremos cada concepto de forma clara y sencilla. Al final, habrás dominado los fundamentos para empezar a construir tus propias experiencias interactivas.

Preparando el Escenario: Nuestra Primera Escena
Antes de escribir una sola línea de código, necesitamos un escenario sobre el que actuar. En Godot, todo se organiza en escenas, que a su vez están compuestas por nodos. Piensa en los nodos como los bloques de construcción de tu juego: un nodo puede ser un personaje, un objeto, una luz, una interfaz de usuario, etc. La forma en que organizas estos nodos en una jerarquía, llamada "árbol de escena", define la estructura de tu escena.
Para nuestro primer proyecto, construiremos una interfaz de usuario muy simple: un botón que, al ser presionado, cambiará el texto de una etiqueta. ¡Un clásico "Hola Mundo" interactivo!
Sigue estos pasos para crear la estructura de la escena:
- Abre Godot y crea un nuevo proyecto.
- En el editor 2D, ve al panel "Escena". Haz clic en el botón "Otro Nodo" o presiona
Ctrl+A. - Busca y añade un nodo de tipo
Panel. Este será el nodo raíz de nuestra escena de interfaz de usuario, un contenedor simple. - Con el nodo
Panelseleccionado, vuelve a presionarCtrl+Apara añadirle un hijo. Busca y añade un nodoButton. - Nuevamente, con el
Panelseleccionado, añade otro hijo: un nodoLabel.
Al final, tu árbol de escena en la esquina superior izquierda debería verse así:
- Panel
- Button
- Label
Ahora, usa el editor visual para posicionar y redimensionar el botón y la etiqueta dentro del panel. Desde el panel "Inspector" a la derecha, puedes cambiar sus propiedades. Por ejemplo, selecciona el nodo Button y en la propiedad `Text`, escribe "Púlsame". Selecciona el nodo Label y en su propiedad `Text`, escribe "Esperando..." No olvides guardar tu escena (Ctrl+S), por ejemplo, con el nombre hola_mundo.tscn.
El Corazón de la Lógica: Adjuntando un Script
Ya tenemos el cuerpo de nuestra escena, pero le falta el alma: el comportamiento. Aquí es donde entran los scripts. Un script se adjunta a un nodo para extender su funcionalidad, permitiéndole reaccionar a eventos, comunicarse con otros nodos y, en general, ejecutar la lógica del juego.
Vamos a adjuntar un script a nuestro nodo raíz, el Panel. Haz clic derecho sobre el nodo Panel en el árbol de escena y selecciona "Adjuntar Script".
Aparecerá un cuadro de diálogo con varias opciones:
- Lenguaje: Lo dejaremos en GDScript, el lenguaje nativo de Godot, que es muy similar a Python y perfecto para empezar.
- Hereda de: Se rellenará automáticamente con "Panel". Esto es crucial, ya que significa que nuestro script tendrá acceso a todas las funciones y propiedades de un nodo Panel.
- Ruta: Elige una ubicación para guardar tu archivo de script, que tendrá la extensión
.gd.
Haz clic en "Crear". ¡Felicidades! Acabas de crear tu primer script. El editor de scripts se abrirá automáticamente, mostrándote una plantilla básica:
extends Panel # Called when the node enters the scene tree for the first time. func _ready(): pass # Replace with function body. # Called every frame. 'delta' is the elapsed time since the previous frame. #func _process(delta): # pass Entendiendo la Función _ready()
La función _ready() es una de las funciones de ciclo de vida más importantes en Godot. Se llama automáticamente una sola vez, justo cuando el nodo (y todos sus hijos) ha sido añadido a la escena activa y está listo para funcionar. Es el lugar perfecto para realizar configuraciones iniciales, como obtener referencias a otros nodos o establecer conexiones, que es exactamente lo que haremos a continuación.
Es importante no confundirla con _init(). Mientras que _init() es el constructor de la clase (se ejecuta cuando se crea el objeto en memoria), _ready() se ejecuta más tarde, garantizando que el nodo ya forma parte del árbol de escena y puede comunicarse con seguridad con sus vecinos.
La Magia de la Interacción: Señales y Conexiones
El concepto de señales es fundamental en Godot. Una señal es un mensaje que un nodo "emite" cuando ocurre un evento específico. Otros nodos pueden "escuchar" estas señales y reaccionar ejecutando una función. En nuestro caso, el nodo Button emite una señal llamada `pressed` cada vez que un usuario hace clic en él.
Nuestro objetivo es conectar esa señal `pressed` del botón a una función dentro de nuestro script en el Panel. Hay dos formas de hacerlo: la visual y por código.
Método 1: La Conexión Visual
Godot ofrece una interfaz muy intuitiva para esto:
- Selecciona el nodo
Buttonen el árbol de escena. - En el inspector, ve a la pestaña "Nodo" junto a "Inspector".
- Verás una lista de todas las señales que este nodo puede emitir. Haz doble clic en la señal `pressed()`.
- Aparecerá una ventana para crear la conexión. Selecciona el nodo que recibirá la señal (nuestro
Panel). - En la parte inferior, puedes nombrar la función que se ejecutará. Por defecto, Godot sugiere un nombre como `_on_Button_pressed`. Haz clic en "Conectar".
Godot te llevará automáticamente a tu script y habrá creado una nueva función vacía con ese nombre. ¡Magia!
Método 2: La Conexión por Código (Nuestro Enfoque)
Aunque el método visual es útil, entender cómo hacerlo por código te da un control mucho más profundo y es esencial para escenarios más complejos. Para ello, usaremos dos herramientas clave: la función get_node() y el método connect().
La función get_node("ruta_al_nodo") nos permite obtener una referencia a cualquier otro nodo de la escena. La ruta funciona de manera similar a las rutas de archivos en un sistema operativo. Como el Button y el Label son hijos directos del Panel (donde reside nuestro script), podemos referirnos a ellos simplemente por su nombre.

Vamos a establecer la conexión dentro de nuestra función _ready(), ya que solo necesitamos hacerlo una vez al inicio.
Escribiendo el Código Final
Ahora, vamos a juntar todas las piezas. Borra el contenido de tu script y escribe lo siguiente. Hemos añadido comentarios para explicar cada línea en detalle.
extends Panel # Esta función se ejecuta cuando el nodo Panel y sus hijos están listos. func _ready(): # 1. Obtenemos una referencia al nodo Button. # 2. Llamamos a su método connect() para conectar su señal "pressed". # Argumentos de connect(): # - "pressed": El nombre de la señal que queremos escuchar. # - self: El objeto que contiene la función a la que nos conectamos (nuestro propio script). # - "_on_Button_pressed": El nombre de la función en este script que se ejecutará. get_node("Button").connect("pressed", self, "_on_Button_pressed") # Esta es nuestra función personalizada. Se ejecutará cada vez que la señal "pressed" sea emitida. func _on_Button_pressed(): # 1. Obtenemos una referencia al nodo Label. # 2. Accedemos a su propiedad 'text' y le asignamos un nuevo valor. get_node("Label").text = "¡Hola, Godot!" Este código es limpio, legible y define claramente el comportamiento: cuando la escena esté lista, conecta el botón a nuestra función. Cuando el botón se presione, esa función se ejecutará y cambiará el texto de la etiqueta.
Tabla Comparativa: Conexión Visual vs. por Código
| Característica | Conexión Visual (Editor) | Conexión por Código |
|---|---|---|
| Facilidad de Uso | Muy alta, ideal para principiantes y prototipado rápido. | Requiere escribir código, pero es más explícito. |
| Visibilidad | Las conexiones se ven con un icono verde en el editor, pero no en el script. | La conexión es explícita y visible directamente en el código (`_ready()`). |
| Flexibilidad | Limitada a lo que se puede hacer en el editor. | Total. Permite conectar/desconectar señales dinámicamente durante el juego. |
| Mantenimiento | Si se renombra un nodo o función, la conexión puede romperse silenciosamente. | Si se renombra un nodo, el juego fallará con un error claro en `get_node()`, facilitando la depuración. |
¡Hora de la Verdad!
Con el código listo, es momento de probar nuestro trabajo. Busca el botón "Ejecutar Escena" en la esquina superior derecha del editor (o presiona F6). Tu escena se abrirá en una nueva ventana. Verás tu botón con el texto "Púlsame" y la etiqueta "Esperando...".
Ahora, haz clic en el botón. ¡Voilà! El texto de la etiqueta cambiará instantáneamente a "¡Hola, Godot!".
¡Felicidades! Has creado con éxito tu primera escena con scripts en Godot. Has aprendido a estructurar una escena, adjuntar un script, entender el flujo de ejecución con `_ready()`, y lo más importante, a manejar la interactividad mediante señales y conexiones.
Preguntas Frecuentes (FAQ)
¿Qué significa 'self' en GDScript?
self es una palabra clave que hace referencia a la instancia actual del script. Cuando la usamos en connect("pressed", self, ...), le estamos diciendo a Godot: "Cuando la señal se emita, busca la función en este mismo objeto/script".
Mi `get_node()` no encuentra el nodo, ¿por qué?
Este es un error muy común. Las causas más probables son:
- Un error tipográfico en el nombre del nodo. Recuerda que es sensible a mayúsculas y minúsculas ("Button" no es lo mismo que "button").
- La ruta es incorrecta.
get_node("Button")solo funciona si "Button" es un hijo directo del nodo donde está el script. Si estuviera anidado, la ruta sería, por ejemplo,get_node("Contenedor/Button").
¿Puedo usar otro lenguaje además de GDScript?
¡Sí! Godot tiene soporte oficial de primera clase para C#, que es muy popular y potente. La lógica sería la misma, aunque la sintaxis cambiaría. Además, a través de GDNative (y próximamente GDExtension en Godot 4), la comunidad ha integrado otros lenguajes como C++, Rust, Nim y más.
¿Cuál es la diferencia entre `_ready()` y `_process(delta)`?
Como vimos, _ready() se ejecuta una sola vez al principio. En cambio, la función _process(delta) se ejecuta en cada fotograma del juego. Es el lugar donde pondrías la lógica que necesita actualizarse constantemente, como el movimiento de un personaje, la comprobación de colisiones o la actualización de un contador en pantalla.
Si quieres conocer otros artículos parecidos a Iniciación al Scripting en Godot Engine puedes visitar la categoría Juegos.
