Blog

Unobserved: un side project para experimentar con game dev

El desarrollo de videojuegos siempre me ha llamado la atención. Unobserved es mi forma de explorarlo sin convertirlo en una profesión.

21 de junio de 20266 min de lecturaSergi

Los videojuegos han formado parte de mi relación con los ordenadores desde el principio. Antes de saber qué era programar, ya me fascinaba la idea de que alguien pudiera crear un mundo, definir sus reglas y dejar que otras personas lo explorasen.

Con los años acabé construyendo todo tipo de software, pero nunca he trabajado profesionalmente en game dev. Tampoco creo que lo haga. No tengo intención de cambiar de carrera, montar un estudio o convertir esto en algo más grande de lo que necesita ser.

Aun así, el desarrollo de videojuegos siempre me ha llamado muchísimo la atención.

Hay algo especial en la mezcla de programación, diseño, arte, sonido y sistemas. Un juego puede empezar siendo unos pocos objetos moviéndose por una pantalla y, poco a poco, convertirse en un lugar con su propia lógica. Pulsas una tecla, algo reacciona y, de repente, esas líneas de código parecen estar vivas. Me recuerda a lo que me atrajo de los ordenadores desde el principio: la posibilidad de crear algo desde la nada.

Unobserved nació de esa curiosidad. Es un side project para aprender, experimentar y disfrutar del proceso sin la presión de tener que convertirlo en un producto o en un negocio.

Open source · GPLsergi-io/unobservedUnobserved es open source bajo la licencia GPL. Puedes consultar o descargar el código en GitHub.

Juega al prototipo

Puedes jugar a la versión actual de Unobserved directamente aquí. Haz clic dentro del juego para empezar o abre su página de itch.io si prefieres jugar en una pestaña separada.

La idea es sencilla: pilotas una nave solitaria a través de una galaxia hostil mientras sobrevives a oleadas de enemigos, esquivas asteroides y amenazas ocultas, descubres planetas y mejoras la nave por el camino. Cada partida es un intento de llegar un poco más lejos y tomar mejores decisiones con información limitada.

Hay armas, escudos, drones, misiles, artefactos, pickups y diferentes mejoras. Puedes revelar el mapa a través de la niebla de guerra, llegar a planetas lejanos y colonizarlos usando balizas. Quería que el combate tuviera un punto arcade, pero que la posición, el timing y las mejoras que eliges también importasen.

Llegando a un planeta mientras un vórtice, las naves enemigas y la siguiente mejora compiten por mi atención.

Sigue siendo un prototipo temprano e imperfecto. Hay sistemas que necesitan más trabajo, números que equilibrar, interfaces que cambiarán y muchas cosas que todavía pueden romperse. Pero ese es precisamente el objetivo del proyecto.

Cuando trabajo profesionalmente en software suelo tener experiencia, contexto y una idea razonablemente clara de lo que estoy haciendo. Con el game dev puedo volver a ser principiante. Tengo que descubrir por qué el movimiento no se siente bien, por qué una oleada resulta aburrida o injusta, por qué una mejora parece interesante pero no cambia cómo juegas o por qué un detalle visual diminuto puede hacer que una acción se entienda mucho mejor.

También me ha recordado hasta qué punto todo está conectado dentro de un videojuego. Cambiar la velocidad de una nave afecta a la puntería. Cambiar el alcance de un arma afecta al comportamiento de los enemigos. Añadir un nuevo artefacto puede hacer que una mejora que ya existía deje de tener sentido. Una pequeña decisión en un sistema puede acabar recorriendo todo el juego.

Qué hay detrás de Unobserved

Unobserved está hecho con Godot. Es el primer motor de videojuegos con el que me he sentido realmente cómodo. Me gusta su forma de trabajar, su editor y que me permita concentrarme en el juego en lugar de gastar el poco tiempo que tengo peleándome con la herramienta. La mayor parte de la lógica está escrita en GDScript y dividida en escenas y sistemas reutilizables: naves, enemigos, proyectiles, planetas, pickups, explosiones y artefactos activos tienen sus propias responsabilidades.

Esa estructura basada en escenas ha sido especialmente útil a medida que el prototipo ha ido creciendo. La Nuke, por ejemplo, no es simplemente una explosión grande. Tiene un objeto de inventario, un script de artefacto, un flujo de colocación, una escena para la bomba, movimiento guiado, una escena de explosión, feedback de cámara, reglas de daño, integración con la niebla de guerra y su propio shader. Wormhole Dash, Vortex y las diferentes balizas siguen patrones parecidos, de forma que las nuevas habilidades pueden reutilizar parte de la misma base en lugar de convertirse en hacks aislados.

Los shaders tienen bastante peso en la identidad visual. Los shaders canvas_item de Godot se encargan del fondo procedural de la galaxia, los escudos, la invisibilidad, las transiciones de la niebla, la energía del panel de subida de nivel, las superficies de los planetas, el Vortex, los escaneos de las balizas y varias explosiones. La Nuke es uno de mis ejemplos favoritos: su nube con forma de hongo se genera combinando ruido procedural, máscaras radiales, bloom, humo, fisuras y una onda de choque. GDScript modifica en tiempo de ejecución parámetros como el progreso, el desvanecimiento y una semilla aleatoria, por lo que cada detonación evoluciona y se ve ligeramente diferente.

La galaxia también pasó de ser un campo de estrellas estático a un fondo procedural con estrellas, capas de nebulosas, detalle en los asteroides, control de color y movimiento. Los planetas tienen escenas dedicadas y visuales apoyados en shaders para representar distintos tipos de mundos. Para parte de este trabajo utilicé Pixel Planet Generator de Deep-Fold, un conjunto excelente que dio mucha más variedad visual al prototipo mientras exploraba cuál podía ser su estilo definitivo.

Algunos sistemas son visuales y mecánicos a la vez. La niebla de guerra está dividida en 2 capas: el espacio que nunca se ha explorado y el que ya se exploró pero no es visible en ese momento. El minimapa utiliza ese mismo estado, puede representar varias naves y permite arrastrar la cámara por el universo como si fuera un pequeño mapa de RTS. Enemigos, misiles, drones, pickups, planetas y efectos tienen que reaccionar de forma coherente a lo que el jugador puede ver.

También experimenté con el multijugador bastante antes de lo que probablemente era sensato. Unobserved tiene un controlador de red dedicado al universo y utiliza un enfoque de servidor autoritativo: el servidor conserva el estado real y los clientes solicitan acciones. Naves, inventarios, pickups, armas, destrucción de enemigos, progresión, niebla, game over y reinicios necesitaron algún tipo de sincronización. Llegué a probar la primera versión con hasta 8 jugadores. Sigue siendo experimental y no es el objetivo principal del prototipo público, pero me enseñó lo rápido que el multijugador obliga a definir mejor la propiedad y los límites de cada sistema.

Detrás de todo esto hay una capa muy práctica de herramientas de debug. Los paneles que aparecen en las capturas permiten añadir enemigos, conceder XP, desactivar cooldowns, revelar la niebla, activar God Mode, inspeccionar el rendimiento y forzar una victoria. No son bonitos, pero acortan la distancia entre cambiar un valor y entender qué hace. En un side project construido en pequeños huecos de tiempo, ese ciclo de feedback también forma parte de la tecnología.

Buena parte del proceso no es especialmente glamurosa. Son paneles de debug, gráficos temporales, valores cambiando en tiempo real y muchos intentos que terminan descartados. En las capturas se ven incluso algunas de esas herramientas. Me gusta que sea así porque representa el proyecto de forma bastante honesta: no es un juego terminado que pretende ser perfecto, sino algo que estoy construyendo para entender cómo funcionan los juegos.

Sobreviviendo a una oleada mientras elijo la mejora que quizá consiga que la siguiente sea manejable.

He usado una pequeña cantidad de IA generativa durante el desarrollo, igual que la uso en muchos de los experimentos que hago actualmente. Soy padre, tengo un trabajo y una familia a la que mantener, y el tiempo disponible para los side projects es limitado. Para mí, la IA ha sido otra herramienta para poder seguir avanzando, no un sustituto de las decisiones, el aprendizaje y el cariño que hay detrás del juego.

Yo cuando estaba haciendo Unobserved, mientras mi hijo construia un mapa de Minecraft para jugar con su Hermana. Todo ello con un vídeo de GDConf sobre cómo se hizo A Short Hike de fondo (uno de los grandes favoritos de la familia).

Publicar el prototipo en itch.io también ha sido parte del experimento. Compartir algo inacabado resulta incómodo, especialmente cuando ves cada fallo y cada atajo que has tomado. Al mismo tiempo, un juego guardado en mi ordenador me enseña menos que uno que otra persona puede jugar, entender mal, romper o disfrutar.

No sé hasta dónde llevaré Unobserved. Puede que crezca durante mucho tiempo, que cambie por completo o que se quede como el proyecto que por fin hizo que dejase de mirar el game dev desde fuera y empezase a experimentar con él.

No hace falta que se convierta en mi profesión para que merezca la pena. A veces un side project solo necesita devolverte la curiosidad, obligarte a aprender cosas que no conoces y recordarte lo divertido que es construir.

Por ahora, eso es más que suficiente.

Gracias por leerme, Hack The Planet!