Contenidos
- Del cofre suelto al sistema reutilizable
- Interfaces: la clave para no llenar el proyecto de código sucio
- Programando el cofre: abrir, cambiar sprite y soltar recompensa
- El detector de interacción y el icono sobre la cabeza
- Asignar la tecla de acción con el nuevo Input System
- Persistencia en Unity: el cofre necesita memoria
- El fallo de la primera partida: cuando no existe ningún archivo de guardado
- Limpieza de consola de Unity: warnings hoy, disgustos mañana
- Pausa real al abrir menús o diálogos
- Animaciones con Unity: dejar de moverse sin mirar siempre hacia abajo
- Una base mucho más seria para el RPG
- Preguntas Frecuentes
Un juego donde no puedes tocar nada es poco más que una película aburrida con sprites bonitos. El salto de prototipo a juego de verdad ocurre cuando el mundo responde a lo que hace el jugador. Y ahí entran tres palabras clave: interacción, persistencia y pulido. En esta fase del proyecto top down 2D con Unity toca construir un sistema de interacción escalable, preparar cofres con recompensas, evitar el clásico bug de los cofres infinitos y rematar varios detalles de calidad que hacen que el juego se sienta mucho más profesional. No es solo abrir un cofre. Es sentar la base para hablar con NPCs, activar mecanismos, pausar el movimiento al abrir menús y conseguir que el personaje deje de mirar “para Cuenca” cada vez que se detiene.
Del cofre suelto al sistema reutilizable
El primer paso es visual, pero importante. Se coloca un cofre en la escena como sprite 2D, con su Box Collider 2D para que colisione correctamente con el jugador. Si estás trabajando con pixel art, aquí conviene hacerlo bien desde el principio:
- Sprite Mode en múltiple si la imagen incluye cofre cerrado y abierto.
- Pixels Per Unit ajustado a 16 para mantener la escala consistente.
- Filter Mode en Point (no filter).
- Compression en None.
Después se recorta el sprite para separar el cofre cerrado del abierto, asegurándose de que ambos tengan el mismo tamaño. Este detalle parece pequeño, pero evita que Unity escale un sprite al sustituirlo por otro, algo que queda fatal en un juego pixelado.
Ahora bien, el objetivo no es programar “un cofre”. El objetivo es programar cosas interactuables. Hoy es un cofre. Mañana puede ser un NPC, una palanca, una puerta o un altar raro de esos que luego te teletransportan a un boss.
Interfaces: la clave para no llenar el proyecto de código sucio
La arquitectura buena empieza cuando dejas de pensar en objetos concretos y empiezas a pensar en comportamientos. Por eso aquí se utiliza una interfaz IInteractable con dos métodos esenciales:
- Interact() para ejecutar la acción.
- CanInteract() para saber si todavía se puede interactuar.
La magia está en que el jugador no necesita saber si delante tiene un cofre o un NPC. Solo necesita saber si ese objeto implementa la interfaz y si responde a la interacción.
Eso convierte el sistema en algo limpio, mantenible y escalable. Si más adelante añades diálogos, mecanismos o misiones, no tienes que reescribir el controlador del jugador. Esa es la diferencia entre un tutorial que “funciona” y una base seria para un RPG.
Programando el cofre: abrir, cambiar sprite y soltar recompensa
La clase Chest implementa la interfaz y añade varios datos propios:
- Si el cofre ya está abierto.
- Un identificador único.
- El prefab del ítem que contiene.
- El sprite del cofre abierto.
Cuando se llama a Interact(), el cofre comprueba primero si puede interactuar. Si está cerrado, se abre. Al abrirse:
- Marca su estado como abierto.
- Cambia el sprite al del cofre abierto.
- Instancia el objeto que contiene.
- Lanza el efecto de salto del ítem usando el sistema de bounce ya implementado.
Ese último detalle le da muchísimo sabor visual. No es lo mismo que aparezca una poción clavada debajo del cofre como un ladrillo, que verla salir con un pequeño saltito. Son esas tonterías las que luego hacen que el juego se sienta vivo.
El detector de interacción y el icono sobre la cabeza
Para que el jugador sepa cuándo puede interactuar, se añade un hijo al player llamado Interaction Detector con un Circle Collider 2D en modo trigger. En Unity, ese círculo representa el rango de interacción.
Cuando un objeto interactuable entra en ese radio:
- Se guarda una referencia al objeto cercano.
- Se muestra un icono sobre la cabeza del personaje.
Cuando sale:
- Se limpia la referencia.
- Se oculta el icono.
Ese icono puede ser una interrogación o una exclamación. Aquí se usa la interrogación, muy en la línea de los JRPG clásicos. Es un feedback visual sencillo, pero potentísimo. Le dices al jugador, sin palabras, “aquí puedes hacer algo”.
Asignar la tecla de acción con el nuevo Input System
La interacción se vincula a una acción nueva en el sistema de entrada, por ejemplo Interact, asociada a la tecla E en teclado y a un botón del mando. En este punto es importante entender algo: la lógica no vive en el player como tal, sino en el detector de interacción.
Eso obliga a enrutar correctamente el input para que cuando se pulse la acción, el objeto en rango reciba su llamada a Interact(). Además, hay que proteger el código frente al caso más típico del mundo: pulsar la tecla cuando no hay nada cerca. Si no lo haces, te comes un null reference de manual.
Y sí, de esos que al principio parecen una tontería y luego te revientan la consola.
Persistencia en Unity: el cofre necesita memoria
Aquí aparece el bug que tumba a muchísima gente: abres un cofre, guardas partida, vuelves a entrar… y el cofre está cerrado otra vez, pero ya te quedaste el objeto. Enhorabuena, acabas de inventar las pociones infinitas y has destruido la economía de tu juego.
La solución es que cada cofre tenga una identidad persistente. Para ello se genera un Chest ID único usando un helper global basado en:
- La escena.
- El nombre del objeto.
- Su posición.
Con eso, el sistema de guardado puede registrar si ese cofre concreto ya fue abierto.
Se crea entonces una clase serializable ChestSaveData con dos campos:
- El identificador del cofre.
- Su estado abierto o cerrado.
Después se amplía el SaveData general del juego para incluir una lista de cofres guardados. Al guardar la partida, se recorren todos los cofres de la escena y se serializa su estado. Al cargar, se compara cada cofre de la escena con su información persistida y, si corresponde, se marca como abierto.
Y aquí está lo bueno: abrir el cofre visualmente no es lo mismo que soltar el ítem. Al cargar una partida solo quieres restaurar el estado, no volver a regalar la recompensa. Separar ambas responsabilidades evita bugs y deja la lógica muchísimo más clara.
El fallo de la primera partida: cuando no existe ningún archivo de guardado
Otro bug precioso. Todo parece ir bien hasta que pruebas el juego en limpio, sin archivo de guardado previo. Entonces descubres que faltan slots de inventario, la hotbar no aparece bien y algunas inicializaciones dependen de datos que todavía no existen.
Esto pasa por construir funcionalidad sobre funcionalidad sin probar el caso más básico de todos: el primer arranque del juego.
La solución consiste en refactorizar la carga para que, si no existe fichero, el sistema inicialice correctamente:
- Inventario vacío.
- Hotbar vacía.
- Mapa inicial.
- Estados base del juego.
Después ya se puede crear el archivo por defecto y continuar con normalidad. Es una corrección muy poco glamurosa, pero muy profesional. Los proyectos serios se rompen menos porque se piensa en estos casos límite.
Limpieza de consola de Unity: warnings hoy, disgustos mañana
Ignorar warnings porque “el juego funciona” es una mala costumbre. Si Unity te avisa de Audio Listeners duplicados o de métodos deprecated, no te está decorando la consola. Te está avisando de problemas futuros.
En este proyecto había dos arreglos importantes:
- Eliminar el Audio Listener de la cámara del minimapa.
- Sustituir búsquedas obsoletas como FindObjectOfType por las nuevas APIs recomendadas.
No cambia el aspecto del juego, pero mejora la salud del proyecto. Y eso, cuando el código empieza a crecer, vale oro.
Pausa real al abrir menús o diálogos
Otro detalle muy de prototipo roto: abrir el inventario y seguir moviendo al personaje como si nada. Incluso peor, cambiar de mapa o interactuar con cosas mientras el menú está encima.
Para evitarlo se crea un PauseController centralizado con una bandera estática que indica si el juego está pausado. El menú activa esa pausa al abrirse, y el controlador del jugador la consulta antes de aplicar movimiento.
Esto no solo arregla el inventario. También deja preparado el terreno para los diálogos con NPCs, donde tiene todo el sentido del mundo que el jugador se quede quieto mientras habla.
Animaciones con Unity: dejar de moverse sin mirar siempre hacia abajo
Y terminamos con un detalle de game feel que marca muchísimo la diferencia. Si tu personaje camina hacia la izquierda, se detiene y automáticamente mira hacia abajo, queda raro. Muy raro.
La solución es almacenar la última dirección de movimiento y usarla para un nuevo blend tree de estados idle. En lugar de un único idle, ahora hay cuatro:
- Idle down
- Idle up
- Idle left
- Idle right
Con dos parámetros extra, LastX y LastY, el Animator sabe hacia dónde debe quedarse mirando el personaje cuando deja de moverse.
Además, se ajustan correctamente las transiciones para evitar pequeños tiempos de salida que generan parpadeos o movimientos extraños. Ese microsegundo de transición mal configurado se nota más de lo que parece, especialmente en pixel art.
Incluso el minimapa se puede sincronizar con esta lógica para que el blip del jugador o de los cofres refleje mejor su estado. Es un extra, sí, pero queda bastante fino.
Una base mucho más seria para el RPG
Después de todo este trabajo, el proyecto gana varias cosas a la vez:
- Un sistema de interacción escalable para cofres, NPCs y mecanismos.
- Persistencia robusta para evitar exploits absurdos.
- Corrección de bugs reales de guardado e inicialización.
- Consola limpia y código más mantenible.
- Mejor sensación de control con pausa y animaciones pulidas.
Eso ya no es un juguete. Es una plantilla bastante seria sobre la que construir un top down 2D con Unity.
Si quieres seguir profundizando en esta línea, tienes la ruta completa del top down 2D en Unity con más recursos del proyecto. Y si buscas una formación más amplia para llevar esto a un nivel profesional, puedes echar un vistazo a las rutas de desarrollo de videojuegos de Frogames Formación.
El siguiente paso natural es clarísimo: NPCs, diálogos, misiones y más objetos interactuables. Porque una vez que el mundo puede responder al jugador, ya solo falta llenarlo de cosas interesantes.
Preguntas Frecuentes
¿Por qué usar una interfaz IInteractable en Unity?
Porque permite crear sistemas reutilizables para cofres, NPCs, puertas o mecanismos sin duplicar código.
¿Cómo evitar el bug de los cofres infinitos?
Guardando un identificador único del cofre y su estado abierto/cerrado en el sistema de guardado.
¿Qué ventaja tiene el nuevo Input System de Unity?
Facilita gestionar controles de teclado y mando desde un sistema centralizado y escalable.
¿Por qué pausar el juego al abrir inventarios o diálogos?
Evita movimientos e interacciones accidentales mientras el jugador navega por menús.
¿Cómo mejorar las animaciones idle en un RPG 2D?
Guardando la última dirección de movimiento para que el personaje mire correctamente al detenerse.