Efectos Visuales de Daño en Unity: Parpadeo y Color de Texto
Resumen
Domina un flujo claro en Unity con C#: muestra el daño de enemigos y jugador con números flotantes y añade un parpadeo visual para distinguir cuándo recibes golpes. Esta guía sintetiza la lógica clave, variables y métodos usados para lograr un feedback de daño legible y escalable.
¿Cómo mostrar daño del enemigo y del jugador en Unity?
La clave está en reutilizar el mismo DamageNumber tanto para el ataque del jugador como para el del enemigo. Como el componente no referencia emisor ni receptor, basta con instanciarlo desde el script del enemigo (por ejemplo, en DamagePlayer) y asignarlo desde el editor al prefab del enemigo. Así garantizas consistencia visual.
Reutiliza el mismo prefab de DamageNumber para ambos sentidos del daño.
Instancia el número en la posición de la colisión del enemigo con el jugador.
Asegura rotación neutra para evitar texto girado.
Pasa los puntos de daño al componente DamageNumber.
// En DamagePlayerpublicGameObject damageNumber;// Asignar desde el editor.// Dentro del if donde confirmas el daño al jugador:var clone =(GameObject)Instantiate( damageNumber, collision.gameObject.transform.position, Quaternion.Euler(Vector3.zero));clone.GetComponent<DamageNumber>().damagePoints = damage;
Tip: al modificar el prefab del enemigo, sobrescribe cambios para propagar a instancias hijas.
¿Cómo diferenciar visualmente el daño recibido con parpadeo?
Si los números de daño comparten color, surge confusión. Solución: haz que el personaje parpadee al recibir golpes. Se controlará desde el gestor de vida (por ejemplo, HealthManager) con un flash temporal ajustable. En enemigos, deja la duración a 0 para desactivar el efecto.
Usa variables para activar el flash y medir su duración.
Accede al sprite renderer para controlar el canal alfa.
Alterna visibilidad en tercios del tiempo para un parpadeo claro.
// En HealthManagerpublicbool flashActive;publicfloat flashLength;// duración del parpadeo en segundos.privatefloat flashCounter;// contador interno.privateSpriteRenderer characterRenderer;// acceso al sprite del jugador.voidStart(){ characterRenderer =GetComponent<SpriteRenderer>();}
Activa el parpadeo cuando el personaje reciba daño, solo si está configurado:
// Dentro de DamageCharacter(...)if(flashLength >0f){ flashActive =true; flashCounter = flashLength;}
Cambia la visibilidad con una función que ajusta la alfa del color. Así no alteras los canales RGB originales del personaje:
Recomendación: configura flashLength del jugador a, por ejemplo, 1.0. Para enemigos, déjalo en 0 para no parpadear. Otra variante visual posible: cambiar el color del texto de daño para recibido vs infligido.
¿Qué habilidades y conceptos refuerzas con este ejercicio?
Este flujo practica pilares de C# y Unity orientados a gameplay legible y mantenible.
Reutilización de componentes y prefabs sin acoplar emisor/receptor del daño.
Asignación desde el editor y sobrescritura del prefab padre para propagar cambios.
Posicionamiento en colisiones con collision.gameObject.transform.position.
Instanciación con Instantiate y orientación neutra con Quaternion.Euler(Vector3.zero).
Comunicación entre componentes con GetComponent<DamageNumber>().damagePoints.
Feedback visual controlando SpriteRenderer.color y el canal alfa para visibilidad.
Temporización con Time.deltaTime y contador decreciente.
Control por tramos porcentuales para animaciones simples y legibles.
Uso del operador ternario para asignaciones compactas en C#.
Diseño configurable: variables públicas para el inspector y privadas para estado interno.
¿Tienes otra idea para distinguir daño recibido, como variar el color de los números o añadir un pequeño shake? Comparte tu enfoque y dudas en los comentarios.
cambiar el color no me sale, creo que se puede hacer desde el scrip de DamagePlayer que tienen los enemy, pero no logro llegar a la opción color
te comparto como cambie el DamagePlayer para el cambio de color
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;publicclassDamagePlayer:MonoBehaviour{privateconst string tag_player ="Player";public int damage =10;publicDamageNumber damageNumber;voidUpdate(){}privatevoidOnCollisionEnter2D(Collision2D collision){if(collision.gameObject.tag.Equals(tag_player)){ collision.gameObject.GetComponent<HealthManager>().DamageCharacter(damage);DamageNumber clone =(DamageNumber)Instantiate(this.damageNumber, collision.transform.position,Quaternion.Euler(Vector3.zero)); clone.damagePoints= damage; clone.damageText.color=Color.white;}}}
si quieres que ocupe menos codigo lo del desactivar el sprite renderer usa esto:
<nombredetuvariable>.enabled=true/false;
Genial
Adicionalmente al prefab DamageNumber lo he renombrado a StatusNumber y le cambio el statusNumber.color al color deacuerdo al status que quiero representar ya sea curacion o distintos tipos de daño!.
Yo lo habia hecho totalmente diferente...
Cree un material tipo UI - Text Shader y lo que hago es swapear el material del characterRenderer por un tiempo determinado, adicionalmente esta coroutine acepta el color del Text Shader por lo que es reutilizable para healing y distintos tipos de daño ya sea quemadura hielo etc..
pues ahora voy a hacer los dos el que había echo mas este del flashing