11. ERCIGAME 2D · Ejemplo completo¶
Este ejemplo reúne en un único proyecto los contenidos trabajados en los apartados anteriores. Puede utilizarse como referencia para comprobar el proceso completo antes de realizar la práctica individual.
En esta práctica vamos a crear la base de un videojuego de plataformas 2D en Unity.
Al terminar tendremos:
- Un escenario construido con Tilemap.
- Un personaje con físicas.
- Movimiento horizontal.
- Salto con detección de suelo.
- Animaciones básicas.
- Cambio de orientación del personaje.
- Monedas que se pueden recoger.
Esquema de trabajo¶
Preparar Unity
↓
Crear proyecto Universal 2D
↓
Conocer el entorno de Unity
↓
Importar y configurar assets
↓
Crear escenario con Tilemap
↓
Añadir colisiones al escenario
↓
Crear Player
↓
Añadir Rigidbody2D y Collider
↓
Programar movimiento
↓
Crear GroundCheck + Layer Floor
↓
Programar salto
↓
Configurar físicas
↓
Crear animaciones
↓
Configurar Animator
↓
Orientar personaje
↓
Crear monedas
Diagrama de flujo¶
flowchart TD
A[Instalar Unity Hub] --> B[Configurar licencia]
B --> C[Crear proyecto Universal 2D]
C --> D[Configurar Rider]
D --> E[Conocer el entorno de Unity]
E --> F[Importar assets]
F --> G[Configurar sprites]
G --> H[Crear Tilemap]
H --> I[Dibujar escenario]
I --> J[Añadir colisiones]
J --> K[Crear Player]
K --> L[Añadir Rigidbody2D y BoxCollider2D]
L --> M[Programar movimiento]
M --> N[Crear GroundCheck]
N --> O[Crear y asignar Layer Floor]
O --> P[Programar salto]
P --> Q[Configurar Physics Material 2D]
Q --> R[Crear animaciones]
R --> S[Configurar Animator]
S --> T[Orientar personaje]
T --> U[Crear monedas]
1. Preparar Unity¶
Instalar Unity Hub¶
Instalamos Unity Hub y desde él una versión de Unity 6.
También debemos disponer de una licencia activa de Unity.
2. Crear el proyecto¶
En Unity Hub:
- Pulsar New project.
- Seleccionar la plantilla Universal 2D.
- Indicar el nombre del proyecto.
- Seleccionar su ubicación.
- Crear el proyecto.
3. Configurar Rider¶
En Unity:
Rider será el editor que utilizaremos para escribir los scripts en C#.
4. Conocer el entorno de Unity¶
Seleccionamos el Layout Default.
En la pestaña Game podemos establecer una relación de aspecto de:
Hierarchy¶
La ventana Hierarchy contiene los objetos que existen en la escena:
- Personajes.
- Cámaras.
- Luces.
- Suelo.
- Plataformas.
- Monedas.
- Obstáculos.
SampleScene¶
Es la escena actual.
Una escena puede representar, por ejemplo:
- Un nivel.
- Un menú principal.
- Una pantalla de victoria.
- Una pantalla de Game Over.
Main Camera¶
Es la cámara del juego.
Determina qué parte del escenario verá el jugador.
Global Light 2D¶
Controla la iluminación general de la escena 2D.
5. Importar los assets¶
Utilizaremos como punto de partida:
Dentro de:
creamos:
Arrastramos dentro las carpetas de recursos que vayamos a utilizar.
Una estructura sencilla puede ser:
6. Configurar sprites¶
Para los sprites de pixel art:
Texture Type: Sprite (2D and UI)
Filter Mode: Point (no filter)
Compression: None
Pixels Per Unit: 16
El modo Point evita que Unity suavice los píxeles.
Spritesheets¶
Si una imagen contiene varios sprites:
Después:
Repetimos el proceso con los spritesheets que lo necesiten.
7. Crear el escenario¶
En Hierarchy:
Unity creará una estructura parecida a:
Renombramos el Tilemap, por ejemplo:
8. Crear la Tile Palette¶
Seleccionamos el Tilemap y abrimos:
También puede aparecer la opción Open Tile Palette desde el Inspector.
Creamos una paleta y arrastramos los sprites que utilizaremos como tiles.
Guardamos los tiles generados en:
Ahora podemos pintar el escenario.
9. Separar escenario y decoración¶
Es recomendable utilizar Tilemaps diferentes.
Por ejemplo:
Ground contendrá los elementos con los que colisiona el jugador.
Decoration contendrá elementos puramente visuales.
10. Añadir el fondo¶
Arrastramos la imagen de fondo a la escena.
En su Sprite Renderer establecemos:
Así permanecerá detrás del resto de elementos.
11. Crear el Player¶
Arrastramos el sprite del personaje a la escena y lo renombramos:
En su Sprite Renderer podemos establecer:
Así se dibujará por encima del escenario.
12. Añadir colisiones y físicas al Player¶
Seleccionamos Player y añadimos:
En Box Collider 2D pulsamos:
y ajustamos el collider aproximadamente al cuerpo del personaje.
Evitar que el personaje gire¶
En:
activamos:
13. Añadir colisiones al escenario¶
Seleccionamos el Tilemap Ground y añadimos:
En el Rigidbody 2D:
En Tilemap Collider 2D:
El Tilemap Collider 2D genera las colisiones de los tiles.
El Composite Collider 2D las combina para formar superficies más continuas.
14. Crear el script Player¶
Dentro de:
creamos:
Lo arrastramos al objeto Player.
Código inicial:
using UnityEngine;
public class Player : MonoBehaviour
{
public float speed = 6f;
private Rigidbody2D rb2D;
private float move;
void Start()
{
rb2D = GetComponent<Rigidbody2D>();
}
void Update()
{
move = Input.GetAxisRaw("Horizontal");
rb2D.linearVelocity = new Vector2(
move * speed,
rb2D.linearVelocity.y
);
}
}
Input.GetAxisRaw("Horizontal") devuelve normalmente:
15. Activar el sistema de Input utilizado¶
El código anterior utiliza el sistema de entrada clásico.
Vamos a:
Seleccionamos:
Unity solicitará reiniciar el editor.
16. Crear GroundCheck¶
Para permitir el salto necesitamos saber si el personaje está tocando el suelo.
En Hierarchy:
Para crearlo:
- Seleccionar
Player. - Botón derecho.
- Seleccionar Create Empty.
- Renombrarlo
GroundCheck. - Colocarlo justo debajo de los pies.
17. Crear la Layer Floor¶
Seleccionamos el Tilemap Ground.
En:
creamos:
Después volvemos a seleccionar Ground y establecemos:
Importante
La Layer Floor se asigna al suelo, no al Player.
18. Programar el salto¶
Ampliamos Player.cs:
using UnityEngine;
public class Player : MonoBehaviour
{
public float speed = 6f;
public float jumpForce = 6f;
private Rigidbody2D rb2D;
private float move;
private bool isGrounded;
public Transform groundCheck;
public float groundRadius = 0.1f;
public LayerMask groundLayer;
void Start()
{
rb2D = GetComponent<Rigidbody2D>();
}
void Update()
{
move = Input.GetAxisRaw("Horizontal");
rb2D.linearVelocity = new Vector2(
move * speed,
rb2D.linearVelocity.y
);
if (Input.GetButtonDown("Jump") && isGrounded)
{
rb2D.linearVelocity = new Vector2(
rb2D.linearVelocity.x,
jumpForce
);
}
}
private void FixedUpdate()
{
isGrounded = Physics2D.OverlapCircle(
groundCheck.position,
groundRadius,
groundLayer
);
}
}
19. Configurar GroundCheck en el Inspector¶
Seleccionamos Player.
En el componente Player (Script) configuramos:
Para asignar GroundCheck, arrastramos el objeto hijo desde Hierarchy hasta el campo correspondiente.
La configuración debe quedar conceptualmente así:
Player
├── Sprite Renderer
├── Rigidbody 2D
├── Box Collider 2D
├── Player (Script)
│ ├── Ground Check → GroundCheck
│ ├── Ground Radius → 0.1
│ └── Ground Layer → Floor
│
└── GroundCheck
Y el escenario:
Grid
└── Ground
├── Layer = Floor
├── Tilemap Collider 2D
├── Composite Collider 2D
└── Rigidbody 2D = Static
20. Evitar que el Player se quede pegado a paredes¶
En:
creamos un material, por ejemplo:
Configuramos:
Seleccionamos Player y asignamos este material al campo Material del:
21. Crear animaciones¶
Creamos:
Seleccionamos Player y abrimos:
Creamos las animaciones necesarias:
Para cada animación arrastramos a la ventana Animation los frames correspondientes.
En animaciones que no deben repetirse, como Death, desactivamos:
22. Configurar Animator¶
El Player necesita un componente:
Creamos o utilizamos un único:
y lo asignamos al campo:
Abrimos:
Arrastramos las animaciones al Animator.
23. Animación Idle y Run¶
En Parameters creamos:
Creamos las transiciones:
En ambas:
24. Controlar el Animator desde C¶
Añadimos al script:
En Start():
En Update():
25. Animación de salto¶
En el Animator añadimos:
Podemos crear una transición:
con las condiciones:
Para volver:
En el script actualizamos los parámetros:
26. Orientar al personaje¶
En lugar de modificar la escala del Player, utilizaremos SpriteRenderer.flipX.
Declaramos:
En Start():
En Update():
Así el sprite mira hacia la dirección en la que se mueve sin modificar el tamaño del objeto ni sus colliders.
27. Crear una moneda¶
Seleccionamos el sprite de la moneda y configuramos sus frames.
Arrastramos la moneda a la escena y la llamamos:
Añadimos:
Ajustamos el collider con:
y activamos:
28. Animar la moneda¶
Creamos:
con los distintos frames de la moneda.
Podemos dejar activado:
para que la animación se repita continuamente.
29. Crear Coin.cs¶
Dentro de:
creamos:
Código:
using UnityEngine;
public class Coin : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Player"))
{
Destroy(gameObject);
}
}
}
Arrastramos el script al objeto Coin.
30. Configurar el Tag del Player¶
Seleccionamos:
y establecemos:
Ahora, cuando el Player entre en el Trigger de la moneda, esta desaparecerá.
Resultado¶
Al terminar esta práctica tendremos:
✓ Escenario mediante Tilemap
✓ Colisiones
✓ Player con físicas
✓ Movimiento horizontal
✓ Salto
✓ Detección de suelo
✓ Animaciones
✓ Cambio de orientación
✓ Monedas recogibles
La estructura básica del proyecto será:
Scene
├── Main Camera
├── Global Light 2D
├── Grid
│ ├── Ground
│ └── Decoration
├── Background
├── Player
│ └── GroundCheck
└── Coins
Y dentro de Assets: