Corrección de Bugs en Colisiones y Vida de un Personaje en Videojuegos
Resumen
Pequeños ajustes marcan gran diferencia. Aquí verás cómo corregir la detección de suelo con un raycast en superficies irregulares y cómo visualizar vida y maná privados con SerializedField para depurar mejor. Además, se identifica que no está contemplada la muerte del jugador cuando la vida llega a cero.
¿Cómo corregir el raycast de salto en Unity?
Un raycast demasiado corto puede fallar al detectar el suelo en rocas u objetos con colliders complejos. La solución práctica: exponer la distancia como variable y ajustarla desde el editor hasta encontrar el valor estable.
El valor fijo 1.5 no alcanza el suelo en rocas irregulares.
Pruebas rápidas: 1.6 y 1.7 aún fallan. 1.8 mejora. 2.0 y hasta 2.5 aseguran margen.
Beneficio: colisiones más inteligentes sin depender del collider exacto del suelo.
¿Qué pasos aplicar para el ajuste del raycast?
Crear una variable pública o serializada: jumpRayCastDistance.
Sustituir el 1.5 en Debug.DrawRay dentro de Update.
Sustituir el 1.5 en Physics2D.Raycast dentro del método que comprueba suelo.
Probar valores en tiempo de ejecución hasta que el personaje no se quede enganchado.
publicclassPlayerController:MonoBehaviour{[SerializeField]privatefloat jumpRayCastDistance =1.5f;voidUpdate(){// Visualiza el rayo hacia abajo con la distancia ajustable. Debug.DrawRay(transform.position, Vector2.down * jumpRayCastDistance, Color.red);}boolIsTouchingTheGround(){// Usa la misma distancia para la comprobación real.return Physics2D.Raycast(transform.position, Vector2.down, jumpRayCastDistance);}}
¿Cuándo conviene usar un Polygon Collider 2D?
Cuando un Box Collider no se ajusta bien a la forma, Polygon Collider 2D ofrece mejor precisión. Unity lo divide en fragmentos convexos para cálculos fiables.
Un polígono es convexo si la línea entre dos puntos queda dentro del contorno.
Mayor precisión implica más coste computacional que un cuadrado o un círculo.
Úsalo cuando la justicia del juego lo exija: colisiones “sentidas” como correctas.
Los hijos de un prefab en escena no siempre heredan cambios del padre: revisa y actualiza manualmente.
Incluso el personaje con Capsule Collider podría usar Polygon Collider, según necesidad.
¿Cómo visualizar vida y maná privados con SerializedField?
Si las variables son privadas y no aparecen en el editor, marca con SerializedField para inspeccionarlas sin exponerlas públicamente. Es ideal para depurar la barra de vida y el maná durante el gameplay.
Ventaja: ver valores en el editor sin romper el encapsulamiento.
Facilita validar cuánto daño recibe el jugador al contacto con enemigos.
publicclassPlayerController:MonoBehaviour{[SerializeField]privateint health;// puntos de vida visibles en el editor.[SerializeField]privateint mana;// puntos de maná visibles en el editor.}
¿Qué observar al probar el daño del enemigo?
Aumentar la velocidad del enemigo acelera la prueba del daño.
La barra de vida desciende golpe a golpe de forma visible.
Con SerializedField, se confirma la vida restante del jugador en el inspector.
¿Cómo gestionar la muerte del jugador al llegar a cero?
Actualmente, la vida puede bajar de cero y el juego sigue en marcha. No se activa ninguna lógica de muerte: el jugador permanece activo pese a tener valores negativos.
Estado detectado: la barra deja de cambiar y la vida interna sigue bajando bajo cero.
Falta contemplar el caso de muerte: detener control del jugador, feedback visual o reinicio.
Próximo paso: implementar la gestión de muerte tras alcanzar 0 de vida.
¿Te funcionó el ajuste de la distancia del raycast o preferiste Polygon Collider 2D? Comparte tus resultados, valores que te sirvieron y consejos para optimizar colisiones en tus niveles.
Mi solución para evitar que el personaje se atore en algunos lugares, es usar un Physic Material 2D con fricción 0 y asignarlo al RigidBody2D del personaje.
Creo que tu solucion es mucho mejor, ya que al aumentar el tamaño del raycast al hacer un salto normal si se presiona la tecla rapido dos veces detecta dos saltos y sale de la escena
No se por que pero los enemigos prefabricados puestos en un bloque prefabricado solo salen una vez, en el siguiente bloque del mismo tipo con enemigos, no salen!
Hahah muy cierto, me pasa lo mismo:(
Ya me funcionó... Solo comente la linea del start en Enemy.cs
podrian ayudarme, el juego hasta ahora me corre bien pero en consola me dice esto
NullReferenceException: Object reference not set to an instance of an object
UnityEditor.Graphs.Edge.WakeUp () (at C:/buildslave/unity/build/Editor/Graphs/UnityEditor.Graphs/Edge.cs:114)
y no se a que se debe :S
al parecer estas intentando acceder a un objeto o variable que no no existe o que no encuentra dicho objeto / variable.
vale ya resolvi, busque en internet y decia que era un error del unity y que al reiniciarlo se acomodaba, por que no se pero fue así
[SerializedField] nos permite observar el valor de una variable privada desde el inspector.
Lo que yo hice para arreglar que el personaje toque el suelo fue colocar 2 raycast. Uno de cada lado del personaje. Así por lo menos "un pie" estaría en el suelo.
Esto también da mayor comodidad a la hora de brincar entre plataformas
Esta muy bien de hecho lo optimo son 3 y yo los use para enemigos que estan en el suelo
yo hice casi lo mismo que, Wilmer David Cedeño Mendoza
solamente que el physic material 2D lo puse en el collider
Como ver los valores de variables privadas desde Unity con SerializeField
¿Se puede poner el Game Manager como escena en lugar de cómo objeto vacío en la jerarquía? ¿Y ser la escena Preload?
Me pasa que la instancia del enemigo se crea solo en el primer mapa, Luego no lo instancia en las otras generaciones.
Para todos los que les pase esto, solo hay que borrar el codigo del metodo Start en la clase Enemy
Sí, lo de borrar la línea del método start funciona para esos comportamientos inesperados
Ojala pudiera publicarlo, pero ya al inicio se me superponen todos los menus (gamecanvas, menucanvas y gameOverCanvas).
No explicaron en el curso como solucionarlo :/
Lo de la roca lo solucioné hace varias clases de otra forma, usando un raycast diagonal hacia abajo:
Una pregunta, porque suben el mismo archivo varias veces?, esas son las modificaciones que hacen!?
se agrega el archivo con las modificaciones de la clase
Si, pero tienen que subirlo con un nombre diferente, ¿Porque?
Porque ya tengo ese archivo con ese mismo nombre varias veces, y entonces a la hora de revisar los archivos crea confusiones porque no se sabe cual es cual.
tenia el bug de que los enemigos no se generaban correctamente, lo solucione en el enemy.cs, borrando el contenido de void start y en la parte final del codigo puse un else { return }, para que no tenga colisiones con las kill zone ni las exit zone