Implementa una puntuación por distancia en Unity con un flujo claro: el jugador avanza en el eje x, la interfaz lee ese valor y la puntuación máxima se persiste con PlayerPrefs. Conecta la barra de vida, la barra de maná y el conteo de monedas con un score útil y sin sobrecargar el Update.
¿Cómo calcular la puntuación por distancia en el eje x?
Para medir la distancia recorrida basta con restar la posición x actual del jugador con su posición inicial. No necesitas aplicar el teorema de Pitágoras porque el movimiento relevante es en una sola dimensión.
Solo interesa el eje x: los saltos no alteran la distancia neta.
La distancia es positiva si avanzas a la derecha.
El método debe devolver un float para integrarlo como puntuación.
¿Qué es getTraveledDistance y por qué solo el eje x?
Devuelve la distancia total recorrida desde el inicio.
Ignora y porque el movimiento útil para la puntuación es horizontal.
publicclassPlayerController:MonoBehaviour{privateVector3 startPosition;voidStart(){ startPosition = transform.position;// Punto de inicio.}publicfloatgetTraveledDistance(){// Distancia recorrida en una dimensión (eje x).returnthis.transform.position.x - startPosition.x;}// ... die() más abajo.}
¿Cómo mostrar la distancia como score en la GameView?
Evita buscar el objeto cada frame: usa referencia en Start.
En Update, solo lee el valor ya calculado.
publicclassGameView:MonoBehaviour{privatePlayerController controller;voidStart(){ controller = GameObject.Find("player").GetComponent<PlayerController>();}voidUpdate(){float score = controller.getTraveledDistance();// Actualiza la UI con "score".}}
¿Cómo persistir la puntuación máxima con PlayerPrefs?
La puntuación máxima debe guardarse al morir, justo antes de reiniciar. PlayerPrefs permite leer con un valor por defecto y escribir solo si la distancia actual supera la guardada.
Lee con PlayerPrefs.GetFloat("maxscore", 0f).
Compara y guarda con PlayerPrefs.SetFloat("maxscore", valorActual).
Recupera el maxscore en la interfaz para mostrarlo siempre.
¿Dónde y cuándo guardar el maxscore?
En el método die del jugador, antes del game over.
Solo si traveledDistance > previousMaxDistance.
publicclassPlayerController:MonoBehaviour{// ... startPosition y getTraveledDistance() arriba.privatevoiddie(){float traveledDistance =getTraveledDistance();float previousMaxDistance = PlayerPrefs.GetFloat("maxscore",0f);if(traveledDistance > previousMaxDistance){ PlayerPrefs.SetFloat("maxscore", traveledDistance);}// Reinicia la partida o lanza el game over.}}
¿Cómo recuperar maxscore en la interfaz?
Lee siempre con valor por defecto para evitar nulos la primera vez.
Muestra ambos: score actual y maxscore.
publicclassGameView:MonoBehaviour{privatePlayerController controller;privatefloat maxscore;voidStart(){ controller = GameObject.Find("player").GetComponent<PlayerController>(); maxscore = PlayerPrefs.GetFloat("maxscore",0f);}voidUpdate(){float score = controller.getTraveledDistance();// Renderiza score y maxscore en la UI.}}
¿Cómo aumentar la dificultad con el LevelManager?
Si tus bloques de nivel son equiprobables, puedes sesgar la generación para que salgan más bloques complicados y el testeo sea más útil.
Duplica el bloque difícil varias veces.
Mantén un bloque inicial sencillo y varios difíciles.
Con 10 bloques totales y 9 difíciles, el 90% serán desafiantes.
¿Qué truco garantiza más bloques complicados?
En el LevelManager, registra el bloque fácil una vez.
Registra el bloque difícil nueve veces.
La probabilidad efectiva favorece al bloque difícil sin código extra.
¿Tienes dudas sobre el cálculo en el eje x, la integración en GameView o la persistencia con PlayerPrefs? Comparte tu caso y comentamos cómo ajustarlo a tu proyecto.
Por motivos del enseñanza se guarda el score en el PlayerPrefs, pero como ya fue dicho, este es para guardar preferencias, mas no para guardar puntajes, ni guardar partida, entre otros. Es posible? si lo es como ya lo vieron, pero no es su propósito.
Y cual es el indicado?
Como le hago para solo tener números enteros en el Score???
.
Intente cambiar de float a int las variables correspondientes pero me marca error por que el this.transform.position.x me da como defecto un numero float (con decimales) y Unity no convierte de int a float.
en vez de decirle en el update que tenga "f1" (osea que se muestrre un decimal) ponle un cero asi:
de donde sale ese valor maxscore dentro del playerPref? De donde sale esa opcion ?
Yo convertí al PlayerController en singleton a fin de cuentas, asi evitaba inicializar la variable en cada script y me ahorre un par de lineas de código
Muchas gracias, hice eso justamente y ahora no tengo problemas con los errores de instancia nula
Hola te recomiendo que si tu personaje se queda pegado con las paredes esto se debe a que el collider tiene fricción esto se puede cambiar creando un physics material 2D y agregarlo a nuestro al collider de nuestro personaje, esto se crea haciendo
click izquierdo create -> physics material 2D, luego de eso si seleccionas el physics material 2D tendrás 2 casillas con números deja las 2 casillas en 0, luego arrastre este material al collider de nuestro personaje en la casilla que dice material
no me deja
Si tenes problemas para asignar el Physics Material es que quizás estés creando el de 3D y no el de 2D.
Para crear el correcto sería de la siguiente forma.
Espero que te sirva. Saludos
El maxScore no me funciona, revise el codigo 100 veces ya y no veo el error
Ya solucione los 2 problemas.
Sencillamente las cajas de texto eran muy pequeñas para mostrar el contenido completo de los números. Estirarlas un poco soluciono el bug.
EL escore desaparece de la vista al cabo de un tiempo, llega a 15-20-25 y parpadea hasta que no queda visible
Alguien mas con el mismo problema?
MaxScore. Para calcular la distancia recorrida por el jugador:
Calculamos el punto de inicio para saber el punto de fin.
La puntuación máxima la vamos a persistir en disco (fichero) - Player prebs.