Control de Vida y Muerte de Personaje en Videojuegos
Resumen
Detén la vida negativa con un control simple y fiable: añade una condición que, al llegar a 0 puntos de vida, ejecute la muerte del personaje y active el game over. Con dos líneas claras en tu lógica de daño y curación, aseguras una experiencia consistente, con animación de muerte y reinicio de partida.
¿Cómo impedir la vida negativa y finalizar la partida?
En el player controller, localiza el método que gestiona tanto curación como daño: collect health. Ya controla el límite superior de vida, pero faltaba contemplar el caso contrario. Agrega un condicional para cuando los puntos de vida sean menores o iguales a 0 y llama al método de muerte.
¿Dónde añadir la condición en collect health?
Inserta esta comprobación al actualizar los health points tras recibir daño:
if(healthPoints <=0){die();}
Con esto, en vez de depender solo de una kill zone, el personaje muere al quedarse sin vida y se lanza todo el flujo de fin de partida.
¿Qué hace el método die con game over?
El método die vuelve a comprobar la puntuación máxima, cambia la animación a muerte y llama al game over del manager. Este, a su vez, hace un set game state, muestra la interface de game over y permite reiniciar la partida. Resultado: final limpio y controlado cuando la vida llega a 0.
¿Cómo validar el cambio con una prueba rápida?
Guarda el script, vuelve al editor y prueba en ejecución. Salta (incluye el supersalto si lo deseas) y fuerza la reducción de vida acelerando al enemigo: de 1.5 a 10. Verás la barra descender hasta 0, la animación de muerte y el fin del juego correctamente.
Ejecutar play y observar la barra de vida.
Usar el supersalto para moverte con rapidez.
Aumentar la velocidad del enemigo: de 1.5 a 10.
Esperar a que la vida baje a 0.
Confirmar animación de muerte y game over.
¿Qué sigue para pulir y personalizar?
Ahora tienes todo para un acabado profesional. Crea niveles únicos y pantallas personalizadas. Sustituye los placeholders de monedas y puntuación actual en la pantalla de game over por los valores que ya calcula tu lógica de partida. El objetivo: un diseño coherente con tu visión.
Diseñar niveles únicos y personalizados.
Reemplazar placeholders por datos reales de monedas y puntuación.
Ajustar la UI de game over con tu estilo.
Exportar y compartir un video del resultado.
Pronto añadirás audio, sonidos y efectos especiales, y cerrarás jugando lo que has construido. ¿Qué mejoras vas a implementar primero? Comparte tus avances y dudas en comentarios.
Mi OnTriggerEnter2D está funcionando como un OnTriggerStay2D ¿Por qué será?
a mi me esta pasando algo igual, la variable de enemy damage es 10 pero cuando le dejo al personaje para que reciba daño enemigo en vez de bajar de 10 en 10 cada vez que se produce el on trigger enter
de 100 de voda baja a 60 entonces la accion se esta repitiendo 4 veces en 1 segundo no se xk
ya vi que es lo que pasa, al añadir el enemigo dentro del prefab, si este prefab se duplica X veces durante el juego, el enemigo tambien se duplicara cuantas veces este el prefab en la escena pero en vez de estar con el prefab respectivo, todos los enemigos nacesn en la misma posición uno debajo del otro
Una recomendación para que al morir el personaje no quede como flotando, es usar el BoxCollider2D y editar su offset :
Vector2 startOffsetGround;publicvoidDie(){//modificacion de offset de collider ground colliderGround.offset=newVector2(0,0); float travelledDistance =GetTravelledDistance();//persistir datos jugador - preferencias en sesion float previousMaxDistance =PlayerPrefs.GetFloat("maxscore",0f);if(travelledDistance > previousMaxDistance){PlayerPrefs.SetFloat("maxscore", travelledDistance);} animator.SetBool(STATE_ALIVE,false);GameManager.sharedInstance.GameOver();}
importante guardar la posición del offset al iniciar el juego para que al reiniciar la partida el personaje vuelva a tener su offset original.
colliderGround.offset= startOffsetGround;
Gracias muy bueno tu aporte.
Hola Intente usar tu solucion pero al parecer no pude, use : groundCollider=GetComponent<PolygonCollider2D>(); ya que uso un poligono en lugar de un box colider pero al ponerla en ceros en el metodo die no pasa nada, el raycast sigue haciendolo flotar
Tengo una grandísima duda y agradecería la ayuda.
Estoy en la corrección de algunos bugs del juego.
Mi problema es el siguiente:
Cada vez que se genera un nivel procedural, luego de recorrer los niveles, los enemigos no se están autogenerando con el nivel. Sólo me sale el nivel sin el enemigo.
¿Alguien sabe por qué no se inicializa?
Gracias <3
Dejo un ejemplo de lo que ocurre:
Solucionado!!
Vale, fue una simple linea que tuve que tapar.
El problema es al inicializar la posición del personaje, en el start.
De alguna forma impedía que cuando eliminara el bloque, el enemigo no se destruía sino que continuaba su trayectoria.
Por si a alguien le pasa lo mismo, esta fué la linea de código que tapé.