Desarrollo de videojuegos con ayuda de la Inteligencia Artificial
En el proceso de creación de videojuegos intervienen múltiples actores, cuánto mayor es el tamaño del mismo más número de personas suele intervenir en él. Desde el diseño de mecánicas de juego hasta la banda sonora, son muchas las áreas que participan en el proceso y cada cuál más específica, hasta ahora era necesario contar con un grupo de gente con múltiples roles para poder dar vida a un videojuego pero eso está cambiando.
AVISO No tengo experiencia en desarrollo de videojuegos más allá de varias pruebas y bocetos que he hecho en momentos puntuales, este es un experimento de fin de semana hecho en menos de 12 horas. Tanto el «arte» como las mecánicas son muy básicas, no me he parado nada en tratar las imágenes generadas ni aplicar efectos, simplemente he escogido varias imágenes acordes a la temática del juego. El resultado de este experimento no es el objetivo del artículo sino el proceso de desarrollo en sí, apoyándose en modelos de inteligencia artificial.
La idea es muy simple, dar toques a la pelota con cada pulsación del ratón en ella sin que ésta se caiga teniendo en cuenta que sólo podemos tocarla dentro de la mitad inferior de la pantalla. Podemos también dibujar gestos (a la vez que pulsamos) en la pantalla, círculos, cuadrados, triángulos, etc, para sumar puntos de bonus extra si los cerramos correctamente mientras la pelota vuela, simulando las acrobacias que se hacen cuando se dan toques con un balón de verdad, cuánto más largo el gesto mayor cantidad de puntos una vez se toca la bola de nuevo.
106 conseguí yo, ¿Lo superas?
Gracias a los algoritmos de machine learning que nos permiten automatizar tareas hasta ahora al alcance de sólo aquellos con las habilidades necesarias podemos no sólo optimizar la inversión de tiempo en la generación y creación de recursos sino también iniciarnos en el proceso de desarrollo de software en general y videojuegos en particular fácilmente.
El diseño de concepto, mecánica, arte, personajes, etc requiere de una inversión de recursos enorme, iterar una y otra vez sobre la idea hasta dar con el estilo deseado conlleva la creación y «descarte» necesario de recursos que consumen tiempo al proceso. El prototipado del mismo implica también una gran inversión de tiempo creando código para implementar las interacciones entre los diferentes elementos del juego sumado al tiempo de testeo y resolución de errores, eso sin pensar en la configuración y el despliegue de toda la infraestructura implicada para poner el juego en producción y de la inversión en la promoción del mismo.
Suelen ser procesos a medio y largo plazo por la propia idiosincrasia del proyecto, cuánto más grande (más elementos intervienen y más detalle en los mismos) mayor el número de especialistas necesario y el tiempo a invertir. Algo que poco a poco se está empezando a simplificar con la llegada de los algoritmos de «inteligencia artificial», tanto Stable Diffussion, Dall-E 2 o Midjourney entre otros nos permiten generar múltiples imágenes y ajustarlas a nuestras necesidades, incluso crear algunas a partir de un diseño más simple inicial, un boceto.
ChatGPT nos permite dotar de mayor inteligencia a los personajes no jugables (NPC – Non Playable Character) de nuestro juego o adaptar los textos a la evolución de la historia sin necesidad de que éstos tengan que estar predefinidos, el propio código fuente para implementar las mecánicas de los diferentes elementos e incluso ayudarnos en el proceso de aprendizaje, que es en lo que nos centraremos en este artículo ya que además de proporcionarnos la capacidad de crear un videojuego nos van a ayudar a aprender a hacerlo, adquirir experiencia tanto en la programación de código como en el uso específico de Unity y las partes que intervienen para construir una escena y por consecuencia, un videojuego.
¿Que no te lo crees? Preguntémosle a ChatGPT cómo crear un videojuego para dar toques a una pelota con Unity.
Quiero crear un videojuego para dar toques a una pelota en Unity y no sé por dónde empezar, ¿puedes ayudarme?
¡Por supuesto! Crear un videojuego para dar toques a una pelota en Unity es un buen proyecto para iniciarse en el desarrollo de videojuegos. Aquí te proporciono los pasos generales para empezar:
- Descarga e instala Unity: Lo primero que necesitas hacer es descargar e instalar Unity en tu computadora. Puedes descargar Unity desde su sitio web oficial.
- Crea un nuevo proyecto en Unity: Abre Unity y crea un nuevo proyecto en blanco. Selecciona una ubicación en tu computadora donde guardarás el proyecto.
- Agrega una bola al proyecto: Añade una bola al proyecto para que puedas empezar a trabajar en ella. En la ventana de «Project», haz clic derecho y selecciona «Create» y luego «3D Object» y luego «Sphere». Esto creará una bola en tu escena.
- Configura la física de la bola: La física es una parte importante de cualquier juego que implique objetos en movimiento. Para configurar la física de la bola, selecciona la bola en la escena y luego en la ventana «Inspector», cambia los valores de «Mass» (Masa) y «Drag» (Arrastre) para ajustar el comportamiento de la bola. Juega con estos valores hasta que te guste cómo se comporta la bola.
- Añade controles para la bola: Necesitas añadir controles para la bola para que puedas moverla alrededor de la escena. Para hacer esto, crea un nuevo script haciendo clic derecho en la ventana «Project», selecciona «Create» y luego «C# Script». Nómbralo «BallController».
- Escribe el código para los controles de la bola: Abre el script «BallController» en tu editor de código favorito y escribe el código para mover la bola. Por ejemplo, puedes escribir un código que mueva la bola hacia la izquierda cuando presionas la tecla «A» y hacia la derecha cuando presionas la tecla «D». Puedes encontrar muchos tutoriales en línea para ayudarte a escribir el código que necesitas.
- Añade un objetivo: Para dar un propósito al juego, añade un objetivo al que la bola debe llegar. Puedes crear otro objeto en Unity, como un cubo, y configurar su posición en la escena. Luego, escribe código en el script «BallController» para detectar cuando la bola llega al objetivo.
- Dale estilo al juego: Añade elementos visuales como fondos, texturas y sonidos para darle estilo al juego. Puedes descargar recursos en línea o crear los tuyos propios.
Estos son los pasos básicos para empezar a crear un juego de dar toques a una pelota en Unity. ¡Buena suerte en tu proyecto!
Sin mayor problema ChatGPT nos guía para empezar pero quizá alguna de las partes nos suene a chino, de ser así continuamos hasta el punto en el que no sepamos continuar y le volvemos a preguntar sobre ese punto concreto. Descargar Unity, abrirlo y crear el proyecto es algo trivial y está bien explicado pero puede que al llegar al cuarto punto para la física de la bola no tengamos ni idea de lo que quiere decir o no encontramos los valores o en el paso sexto no tengamos ni idea de cómo crear el script para los controles de la bola.
¿Como puedo hacer en el punto 6 el script para hacer que la pelota rebote y vuelva a subir cuando haga click en ella?
Le he cambiado la mecánica principal ya que al inicio nos explicó cómo hacer para que podamos mover la pelota utilizando las letras «A» y «D» pero nosotros queremos que el rebote se produzca cuando se haga click en la pelota por lo que lo reorientamos con nuestras preguntas.
A lo que nos responde.
Para hacer que la pelota rebote y vuelva a subir cuando haces clic en ella, necesitas añadir código al script «BallController» que detecte cuándo se hace clic en la pelota y le aplique una fuerza para que rebote.
Aquí tienes un ejemplo de cómo puedes escribir el código para que la pelota rebote y vuelva a subir al hacer clic en ella:
using UnityEngine;
public class BallController : MonoBehaviour
{
public float jumpForce = 10f;
private bool isGrounded = false;
void Update()
{
// Detecta cuándo se hace clic en la pelota
if (Input.GetMouseButtonDown(0) && isGrounded)
{
// Aplica una fuerza a la pelota para hacerla saltar
GetComponent<Rigidbody>().AddForce(new Vector3(0f, jumpForce, 0f), ForceMode.Impulse);
isGrounded = false;
}
}
// Detecta cuándo la pelota colisiona con el suelo
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Ground")
{
isGrounded = true;
}
}
}
Este código añade una variable llamada
jumpForce
para controlar la fuerza con la que la pelota salta, una variable booleanaisGrounded
para detectar si la pelota está en el suelo y un métodoOnCollisionEnter()
para detectar cuando la pelota colisiona con el suelo. En el métodoUpdate()
, el código detecta si se ha hecho clic en la pelota y si la pelota está en el suelo. Si se cumple esta condición, se aplica una fuerza vertical a la pelota usando el métodoAddForce()
deRigidbody
para hacerla saltar. En el métodoOnCollisionEnter()
, el código detecta si la pelota ha colisionado con el suelo y actualiza la variableisGrounded
en consecuencia.Espero que esto te ayude a lograr el efecto que buscas.
Vamos guiando a ChatGPT según nuestras necesidades y el algoritmo nos va ofreciendo sus respuestas que a la vez nos sirven para redirigirnos nosotros mismos, muchas veces fallará o no hará exactamente lo que le pedimos pero podemos intentar explicarle la idea de diferentes maneras para así obtener resultados más acordes que nos conduzcan a nuestra meta.
Poco a poco iremos conociendo conceptos bastante comunes en el desarrollo de videojuegos como son los objetos 2D, 3D, ejes de coordenadas, componentes de colisiones y cuerpos, físicas, a configurar las diferentes escenas, los menús, audios y textos, etc. Con sólo una idea puedes construirte al menos un prototipo y estudiar su viabilidad, también tendrás algo para presentar a un profesional en caso de ser necesario, lo que ayudaría tanto a explicar la idea como a detectar problemas con mayor fluidez.
La habilidad artística no te la va a dar una inteligencia artificial por ahora pero sí que te ayudará a traducir tus ideas en productos.
Cómo decía al principio no soy ningún experto ni en Unity ni en desarrollo de videojuegos por lo que este experimento ha sido para comprobar hasta dónde era capaz de llegar en pocas horas, convertir una pequeña idea en un proyecto interactivo, no le he dedicado más de 12 horas pero si no fuera por la inteligencia artificial no habría creado ni la mitad.
Es cierto que sí tengo experiencia en programación, sé cómo «encajar» las cosas para que funcionen y cambiar determinadas partes para ajustarlas al proyecto pero hasta en eso puede ayudarte ChatGPT si no sabes cómo.
¿Cómo hago para aplicar el comportamiento del script al balón?
Para aplicar el comportamiento del script al balón, sigue estos pasos:
- Selecciona el balón en la jerarquía (Hierarchy) de Unity haciendo clic en él.
- En la ventana de «Inspector», busca el componente «Add Component» y haz clic en el botón «+» para añadir un nuevo componente.
- Escribe el nombre del script que has creado en el campo de búsqueda, por ejemplo «BallController», y selecciona el script en la lista de resultados.
- Ahora el script se ha añadido al balón y puedes personalizar sus variables en la ventana de «Inspector». Por ejemplo, puedes ajustar el valor de «jumpForce» para cambiar la altura del salto del balón.
Con estos pasos, has aplicado el comportamiento del script al balón y podrás jugar y probar tu juego para ver cómo funciona el salto al hacer clic en el balón.
Pero no me pidas que calcule (no en el mismo tiempo) el ángulo con el que la pelota debe salir disparado según la posición en la que se toca el balón con respecto a su parte central, ChatGPT lo ha creado fácilmente, no está perfecto y probablemente haya mejores formas de hacerlo si nos paramos a analizar cada una de las instrucciones que en este script se ejecutan, también seguro puede hacerse más realista pero es una buena base para haber sido creado en segundos a partir de unos textos descriptivos.
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
// Check if the click position is lower than half of the screen height
float clickY = Input.mousePosition.y / Screen.height;
if (clickY > 0.5f)
{
return;
}
Vector2 mousePos = mainCamera.ScreenToWorldPoint(Input.mousePosition);
Collider2D hitCollider = Physics2D.OverlapPoint(mousePos);
if (hitCollider != null && hitCollider.gameObject == gameObject)
{
// Calculate the horizontal force based on the distance between the click position and the ball center
float distance = mousePos.x - transform.position.x;
// Determine the horizontal direction based on the side of the touch on the ball
float horizontalDirection = -(Mathf.Sign(distance) * -1f);
// Increase the horizontal force multiplier based on the distance of the touch from the center of the ball
float horizontalForceMultiplier = Mathf.Lerp(0.5f, 1f, horizontalForce);
// Calculate the upward force to be applied to the ball
float verticalForce = jumpForce * (1f + horizontalForce);
// Apply the forces to the ball
rb.velocity = Vector2.zero;
float angle = Mathf.Lerp(10f, 70f, horizontalForce);
Vector2 forceDirection = Quaternion.Euler(0f, 0f, angle * horizontalDirection) * Vector2.up;
rb.AddForce(forceDirection * verticalForce, ForceMode2D.Impulse);
Vector2 touchPosition = Input.mousePosition;
// RotateBall(touchPosition);
StartCoroutine(SquashEffect(touchPosition));
// Notify the tap handler that the ball was tapped
if (tapHandler != null)
{
tapHandler.OnBallTapped();
}
}
}
}
Y es que puede tanto con tareas rutinarias como con algunas más complejas, dependerá de nuestra habilidad a la hora de preguntarle para sacar su mayor potencial, normalmente iterar una y otra vez sobre la idea hasta que vayamos encontrando un camino en común sobre el que avanzar e ir ajustando.
Todo el código integrado en el juego está creado por ChatGPT yo lo único que he hecho ha sido conectar algunas partes entre sí y modificar determinados valores en algunos casos puntuales pero no he creado ninguno de los scripts. El resultado es el siguiente:
Algo muy simple pero recordemos que hecho en 12 horas por alguien no experimentado, el resultado por una persona con experiencia hubiera sido muy diferente, lo bueno es que gracias a este experimento he adquirido conocimientos que antes no poseía y de cada uno depende continuar perfeccionándolos para lograr mejores resultados en un futuro. Si te gusta el desarrollo de videojuegos o tienes alguna idea en mente te invito a intentarlo, quizá tú mismo te sorprendas de hasta dónde eres capaz de llegar.
Te dejo todo el código fuente publicado en Codeberg para que puedas descargarlo si quieres y modificarlo a tu gusto o simplemente cotillear su código, es libre y puedes hacer con él lo que quieras, con las imágenes también. Se podrían añadir niveles «Medio» y «Difícil» simplemente cambiando la altura de la zona permitida o efectos llamativos a los textos de bonus y puntuación, quizá también preguntarle a ChatGPT cómo añadir efectos de audio para que nos ayude a conseguirlos (para crearlos sólo necesitas un micrófono y hay muchas páginas con efectos para uso libre en pagínas como FreeSound, OpenGameArt ó Itch.io) y ponerlos cuando el balón hace el efecto rebote por ejemplo, son muchas cosas las que se pueden corregir y añadir en el proyecto, anímate.
Cualquier duda o comentario que quieras hacer puedes dejarlo abajo.
Relacionado
- Código fuente: Codeberg
- Juego: Itch.io
- ChatGPT: OpenAI
- Stable Diffusion: Google Colab
- Dall-E 2: OpenAI
- Midjourney: Discord
- Página principal Unity: Unity
- Recursos libres para juegos: FreeSound, OpenGameArt ó Itch.io
Desarrollador de software, informático, emprendedor y entusiasta por la tecnología desde tiempos inmemoriales. Inquieto por defecto, curioso por naturaleza, trato de entender el mundo y mejorarlo utilizando la tecnología como herramienta.