Unity RPG: stats por nivel con arrays

Clase 40 de 60Curso Avanzado de Creación de RPGs con Unity

Resumen

Mejora un RPG en Unity con subidas sucesivas de nivel claras y escalables. Aquí verás cómo añadir vida, ataque y defensa mediante arrays en CharacterStats, sincronizar la vida con HealthManager y hacer que el WeaponDamage sume el ataque del personaje. Todo con un flujo coherente, fácil de mantener y listo para crecer con más estadísticas.

¿Cómo escalar estadísticas por nivel con arrays en CharacterStats?

Para controlar cada subida de nivel, se definen arrays por estadística. Así cada nivel tiene su valor de vida, ataque y defensa. La idea: que el progreso sea no lineal para dar sensación de crecimiento real.

¿Qué arrays crear y por qué?

  • Define un array por stat: hpLevels, strengthLevels, defenseLevels.
  • Asegura que cada array tenga tantos elementos como niveles del juego.
  • Permite añadir más stats: suerte, velocidad, ataque mágico o defensa mágica.
public class CharacterStats : MonoBehaviour {
    public int[] hpLevels;        // vida por nivel.
    public int[] strengthLevels;  // ataque por nivel.
    public int[] defenseLevels;   // defensa por nivel.

    public int currentLevel;      // nivel actual del personaje.
}

¿Cómo diseñar progresiones no lineales?

  • Vida con saltos crecientes: 200 inicial, luego 220, 240, 275, 300, 325, 360, 400, 450, 500. No es lineal: mezcla tramos suaves con picos.
  • Ataque con incrementos irregulares: 0 extra en niveles iniciales; después +1, +2, +2, +3, +3, +3, +5, +6. No sube en cada nivel.
  • Defensa gradual: 0 al inicio; +1 en los tres primeros; +2 en los siguientes; +3 y un salto de +5 al final.

Estos valores se coordinan después con los managers y los scripts que hacen o reciben daño para que la experiencia, la vida y la interfaz estén sincronizadas.

¿Cómo sincronizar la vida con HealthManager al subir de nivel?

La vida máxima debe actualizarse cuando cambie el nivel. Como CharacterStats y HealthManager conviven en el mismo Player, se comunican con GetComponent y se mantienen sincronizados.

¿Dónde referenciar HealthManager?

  • Haz que CharacterStats obtenga el HealthManager en Start con GetComponent.
  • Mantén la referencia privada: es más limpio y seguro.
public class CharacterStats : MonoBehaviour {
    public int[] hpLevels;
    public int currentLevel;

    private HealthManager healthManager; // referencia interna.

    void Start() {
        healthManager = GetComponent<HealthManager>();
    }

    // En el punto donde subes de nivel:
    void LevelUp() {
        currentLevel++;
        // actualizar vida máxima según hpLevels[currentLevel].
        // healthManager.ActualizarVidaMaxima(hpLevels[currentLevel]);
        // opcional: curar al máximo si así está diseñado.
    }
}

¿Qué se actualiza al subir de nivel?

  • La vida máxima se ajusta al valor del array en el nivel actual.
  • La barra de vida y UI se refrescan para mostrar los nuevos valores.
  • Si así se configuró: el personaje se cura al subir de nivel.

¿Cómo hacer que el arma herede el ataque del personaje?

El daño lo aplica el WeaponDamage (por ejemplo, en la swing zone). Como ese script puede estar en un objeto hijo, debe buscar las stats en el objeto padre del arma.

¿Cómo obtener CharacterStats desde el arma?

  • Usa transform.parent para llegar al Player que sí tiene CharacterStats.
  • Referencia las stats en Start y verifica que no sean nulas.
public class WeaponDamage : MonoBehaviour {
    public int damage; // daño base del arma.
    private CharacterStats stats; // para leer strength por nivel.

    void Start() {
        stats = transform.parent.GetComponent<CharacterStats>();
    }

    void OnTriggerEnter2D(Collider2D other) {
        int totalDamage = damage; // base: daño del arma.
        if (stats != null) {
            totalDamage += stats.strengthLevels[stats.currentLevel];
        }

        // aplicar totalDamage al enemigo y mostrar el número de daño.
        // enemy.TakeDamage(totalDamage);
        // DamageNumber.Show(totalDamage);
    }
}

¿Cómo calcular y aplicar el daño total?

  • Combina de forma aditiva: daño del arma + ataque por nivel del personaje.
  • Usa siempre la misma variable para coherencia: el daño que aplicas al enemigo y el que muestras en el damage number debe ser el totalDamage.
  • Si lo prefieres, podrías hacer la combinación multiplicativa (no imprescindible): el concepto se mantiene.

Habilidades y conceptos que te llevas: - Diseño de progresión con arrays por nivel para cada stat. - Comunicación entre componentes con GetComponent en el mismo Player. - Uso de transform.parent para enlazar hijos con el objeto que tiene las stats. - Cálculo de daño aditivo y coherencia entre lógica y visualización. - Actualización de vida máxima y sincronización con UI de salud. - Extensión a nuevas estadísticas sin tocar el núcleo del flujo.

¿Qué otra estadística añadirías o cómo escalarías la defensa en tu proyecto? Comparte tus ideas y dudas en los comentarios.

      Unity RPG: stats por nivel con arrays