Saltar a contenido

Módulo 2 — Disparos (25 min)

¿Qué vamos a lograr?

Que al presionar Espacio salga una bala desde la punta de la nave, viajando hacia arriba, con un pequeño tiempo de espera entre disparo y disparo (para que no sea ametralladora infinita), y que cada bala se destruya sola al salir de la pantalla.

2.1 Crear el punto de disparo (FirePoint)

  1. Con el GameObject Player seleccionado, clic derecho sobre él en la Hierarchy > Create Empty. Esto crea un GameObject vacío como hijo de Player.
  2. Renómbralo a FirePoint.
  3. En el Inspector, pon su Position en algo como X = 0, Y = 0.5, Z = 0 (en coordenadas locales, relativas a la nave) para que quede justo en la punta.

Un GameObject vacío como hijo no dibuja nada en pantalla: solo sirve como una "referencia de posición" que el script va a usar para saber dónde nace cada bala.

FirePoint como hijo de Player, con su Transform

2.2 Crear la bala

  1. En la Hierarchy, clic derecho > 2D Object > Sprites > Square. Renómbralo a Bullet.
  2. En el Sprite Renderer, asígnale un sprite de la carpeta Lasers del pack de Kenney.

El script que controla la bala ya está escrito en Bullet.cs:

using UnityEngine;

// Controla el comportamiento de cada bala disparada por el jugador:
// se mueve hacia arriba y se destruye sola después de un tiempo.
public class Bullet : MonoBehaviour
{
    [Header("Movimiento")]
    public float moveSpeed = 12f;

    [Header("Duración")]
    // Cuántos segundos vive la bala antes de autodestruirse.
    // Esto evita que queden balas acumulándose fuera de la pantalla para siempre,
    // lo que iría gastando memoria de a poco.
    public float tiempoDeVida = 2f;

    void Start()
    {
        // Destroy(gameObject, segundos) programa la destrucción de este GameObject
        // luego de que pase esa cantidad de segundos.
        Destroy(gameObject, tiempoDeVida);
    }

    void Update()
    {
        // transform.Translate mueve el objeto en la dirección indicada.
        // Vector3.up equivale a (0, 1, 0): hacia arriba de la pantalla.
        transform.Translate(Vector3.up * moveSpeed * Time.deltaTime);
    }
}

Por qué se hace así: en vez de calcular los bordes de la cámara (como con la nave), acá usamos un truco más simple: la bala se autodestruye después de tiempoDeVida segundos, tiempo de sobra para que ya haya salido de la pantalla. Dos formas distintas de resolver un problema parecido — vale la pena mencionarlo en el taller.

  1. Arrastra Bullet.cs sobre el GameObject Bullet para agregarlo como componente.

2.3 Convertir la bala en un prefab

Un prefab es una plantilla reutilizable: la vamos a "instanciar" (crear copias) cada vez que se dispare, en vez de tener una sola bala fija en la escena.

  1. Arrastra el GameObject Bullet desde la Hierarchy hasta la carpeta Assets/Prefabs.
  2. Una vez creado el prefab, borra el Bullet que quedó en la Hierarchy (ya cumplió su función: ahora vive como prefab en el Project).

Prefab Bullet con su Sprite Renderer

2.4 Conectar todo en el PlayerController

  1. Selecciona el GameObject Player.
  2. En el componente Player Controller del Inspector:
  3. Arrastra el prefab Bullet (desde Assets/Prefabs) al campo Bullet Prefab.
  4. Arrastra el GameObject FirePoint (desde la Hierarchy) al campo Fire Point.
  5. Presiona Play y prueba disparar con Espacio.

Inspector del Player con Bullet Prefab y Fire Point asignados

Jugando en modo Play: varias balas subiendo por la pantalla

Checkpoint ✅

Al terminar este módulo, al presionar Espacio deberían salir balas desde la punta de la nave, viajando hacia arriba a un ritmo controlado (no una por frame), y desapareciendo solas después de un par de segundos.