Mostrar el daño en pantalla con un texto que sube y desaparece aporta claridad inmediata al jugador. Aquí verás cómo crear un damage number reutilizable en Unity: configura el UI Text, muévelo en Update, destrúyelo tras unos segundos e instáncialo desde el arma para cada golpe. Todo con C# y buenas prácticas de prefab.
¿Cómo crear y configurar el texto de daño en Unity UI?
Para reutilizar un mismo asset en múltiples casos (daño, curación, impacto al protagonista), se parte de un prefab con un componente de texto. El script expone variables públicas para ajustar velocidad, valor y referencia al UI Text desde el editor.
¿Qué variables públicas necesitas?
- damageSpeed: velocidad a la que sube el texto.
- damagePoints: valor numérico a mostrar.
- damageText: referencia al componente Text de UnityEngine.UI.
- No es necesario Start: se asigna todo desde el inspector.
using UnityEngine;
using UnityEngine.UI;
public class DamageNumber : MonoBehaviour
{
public float damageSpeed;
public float damagePoints;
public Text damageText;
void Update()
{
damageText.text = damagePoints.ToString();
transform.position = new Vector3(
transform.position.x,
transform.position.y + damageSpeed * Time.deltaTime,
transform.position.z
);
}
}
¿Cómo se actualiza el contenido y la posición en Update?
- El texto se construye con
damagePoints.ToString().
- El movimiento vertical usa Time.deltaTime para suavidad.
- Los ejes x y z se mantienen, solo cambia y.
- No hay físicas: se modifica
transform.position directamente.
¿Cómo destruir el prefab tras un tiempo con un script simple?
Para evitar acumular objetos en la jerarquía, se destruye el texto tras unos segundos con un script mínimo. Así se mantiene el rendimiento y se limpia la interfaz automáticamente.
using UnityEngine;
public class DestroyAfterTime : MonoBehaviour
{
public float timeToDestroy; // por ejemplo 1.5f
void Update()
{
timeToDestroy -= Time.deltaTime;
if (timeToDestroy <= 0f)
{
Destroy(gameObject);
}
}
}
- Añade el script al prefab del daño.
- Configura
timeToDestroy en el inspector.
- Verás desaparecer el objeto de la jerarquía al cumplirse el tiempo.
- Usa Apply All para propagar cambios al prefab padre cuando veas marcas en el inspector.
¿Cómo instanciar el prefab desde el arma y pasar el valor de daño?
El responsable de crear el texto al golpear es el script del arma, por ejemplo WeaponDamage. Se instancia el prefab en el punto de impacto y se inyecta el daño actual del arma.
¿Dónde asignar y cómo evitar rotaciones?
- Declara una variable pública
GameObject damageNumber en el arma.
- Arrastra el prefab al campo correspondiente en la swing zone.
- Instancia en la posición del hitPoint con
Quaternion.Euler(Vector3.zero) para evitar texto inclinado.
- Almacena el clon para editar su componente DamageNumber.
using UnityEngine;
public class WeaponDamage : MonoBehaviour
{
public GameObject hitPoint;
public GameObject damageNumber;
public int damage;
void DoHit()
{
GameObject clone = (GameObject)Instantiate(
damageNumber,
hitPoint.transform.position,
Quaternion.Euler(Vector3.zero)
);
clone.GetComponent<DamageNumber>().damagePoints = damage;
}
}
¿Qué buenas prácticas aplicar para un HUD legible?
- Reutiliza el prefab para daño del enemigo, daño al jugador y curación.
- Codifica colores: blanco para daño al enemigo, rojo si el enemigo te daña, verde para curación.
- Controla la velocidad con
damageSpeed según el estilo visual.
- Evita rotaciones del texto con
Quaternion.Euler(Vector3.zero).
- Gestiona memoria destruyendo tras tiempo con
DestroyAfterTime.
¿Te gustaría añadir variación de tamaño, fuente o efectos de rebote al aparecer el número? comparte tus ideas y dudas en comentarios.