Recolectables con enum y switch en Unity

Clase 38 de 53Curso de C# para Videojuegos

Resumen

Conviértete en quien define un objetivo claro para el jugador en Unity 2D. Aquí verás cómo añadir monedas y pociones como recolectables, configurar un collider como trigger, y programar en C# un script genérico con enum y switch para gestionar efectos y visibilidad, sin destruir objetos innecesariamente.

¿Cómo añadir recolectables y objetivo de juego en Unity 2D con C#?

Al sumar monedas como asset en la escena, el jugador obtiene un propósito más allá de moverse. La moneda ya existe como prefab animado y se coloca en el escenario. Si no se ve, el problema suele ser de profundidad z: dos objetos en z igual tienden a renderizarse de forma impredecible. Solución: mover el fondo más atrás en z (por ejemplo, si el fondo está en z=10 respecto a la cámara en z=-10, enviarlo a z=11) para evitar artefactos y ver la moneda.

¿Cómo configurar un collider como trigger para una moneda?

  • Añadir un CircleCollider2D al objeto moneda.
  • Activar el check Is Trigger en el inspector.
  • Detectar la entrada del jugador con OnTriggerEnter2D usando la etiqueta "Player".
  • Probar el flujo destruyendo el objeto con Destroy(gameObject) y luego refinar.

Ejemplo rápido de prueba:

void OnTriggerEnter2D(Collider2D other)
{
    if (other.CompareTag("Player"))
    {
        Destroy(gameObject); // prueba inicial para validar la colisión
    }
}

¿Cómo diseñar un script genérico de recolectables con enum y switch?

En lugar de un script por tipo (moneda o poción), se crea un único Collectable extensible. Un enumerado define el tipo de recolectable y un switch aplica la lógica correspondiente. Así, el Game Manager podrá contar dinero y el jugador podrá curarse con pociones.

¿Qué estructura tiene el enum CollectableType?

  • Valores: Money, HealthPotion, ManaPotion.
  • Permite ampliar con nuevos tipos sin reescribir lógica base.
public enum CollectableType
{
    HealthPotion,
    ManaPotion,
    Money
}

public class Collectable : MonoBehaviour
{
    public CollectableType type = CollectableType.Money;
    // ... resto del código
}

¿Cómo gestionar estado, valor y componentes del recolectable?

  • Referencias a componentes: SpriteRenderer y CircleCollider2D.
  • Estado: hasBeenCollected para saber si ya fue recogido.
  • Valor: value = 1 por defecto (sirve como moneda o puntos de curación/maná).
public class Collectable : MonoBehaviour
{
    public CollectableType type = CollectableType.Money;
    private SpriteRenderer sprite;
    private CircleCollider2D itemCollider;
    private bool hasBeenCollected = false;
    public int value = 1;

    void Awake()
    {
        sprite = GetComponent<SpriteRenderer>();
        itemCollider = GetComponent<CircleCollider2D>();
    }
}

¿Cómo implementar show, hide y collect en C#?

En lugar de destruir el GameObject, se muestra/oculta para reutilizarlo al reinstanciar el nivel. Tres métodos concentran la lógica: show, hide y collect.

public class Collectable : MonoBehaviour
{
    // ... campos previos

    void Show()
    {
        sprite.enabled = true;
        itemCollider.enabled = true;
        hasBeenCollected = false;
    }

    void Hide()
    {
        sprite.enabled = false;
        itemCollider.enabled = false;
    }

    void Collect()
    {
        Hide();
        hasBeenCollected = true;

        switch (type)
        {
            case CollectableType.Money:
                // TODO: lógica para sumar al contador global.
                break;
            case CollectableType.HealthPotion:
                // TODO: lógica para curar vida al jugador.
                break;
            case CollectableType.ManaPotion:
                // TODO: lógica para recuperar maná.
                break;
        }
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            Collect();
        }
    }
}

Puntos clave: - OnTriggerEnter2D solo reacciona al tag "Player" para ignorar otros choques. - switch + enum acotan casos y facilitan extensiones con nuevos tipos. - Show/Hide evitan fragmentar el nivel al no destruir objetos.

¿Qué buenas prácticas y habilidades se refuerzan?

Dominar estos pasos mejora tu base de programación en C# para Unity y tu diseño de gameplay.

  • Gestión visual y de colisión: SpriteRenderer, CircleCollider2D, Is Trigger.
  • Control de profundidad: mover el fondo en eje z para un renderizado coherente.
  • Detección de jugador: tags y CompareTag("Player").
  • Estado del objeto: hasBeenCollected para evitar recolectas duplicadas.
  • Valor flexible: value reutilizable para dinero, vida y maná.
  • Arquitectura reusable: un único script Collectable para varios tipos.
  • Flujo de interacción: Show/Hide/Collect como núcleo del recolectable.
  • Uso de prefabs y assets para iterar rápido en la escena.
  • Prueba incremental: primero Destroy(gameObject) para validar, luego refactor a Collect().
  • Sintaxis esencial: enum, switch, case, break, métodos del ciclo de vida como Awake.

¿Quieres compartir cómo extenderías el enum con nuevos ítems o cómo conectarías el contador global? Comenta tus ideas y dudas.

      Recolectables con enum y switch en Unity