Bug de colisiones con Unity 2D

bornex

Hola gente, tengo un pequeño problema.

En ocasiones, en el juego que estoy haciendo, el personaje se queda pillado en la pared de un bloque tal que así:

El caso es que el character es un Poligon 2D Collider y los bloques son Box 2D Collider, puede ser que sea por eso y alguna de las esquinas del personaje se quede clavada en el bloque. Se queda en la animación cayendo. No entiendo porque.

Aprovecho para preguntar otra cosa. Quiero que cuando llegue a la bandera de fin del nivel, pase al siguiente nivel, pero quiero que pase a un selector de nivel. ¿Como haría tal cosa? Una nueva escena con un mini mapa y al tocar en el numero del nivel siguiente se inicie la escena del nivel?

¿Como podría hacer que hasta que no se pase el Level 1 "por ejemplo" el Level 2 no este disponible ?

Gracias.

Shuken

#1

Sobre lo del Collider no se exactamente como ayudarte.

Sobre los niveles yo lo que haría seria una escena donde se pueda escoger los niveles, tal como has dicho. Para el tema de escoger el nivel 2 después del 1 yo utilizo las "Player Preferences". Puedes utilizar (por ejemplo):

  • Para guardar el nivel 1 justo después de habérselo pasado: PlayerPrefs.SetInt("Nivel", 1)
  • Para leer en la pantalla de selección que nivel se ha pasado: PlayerPrefs.GetInt("Nivel", 0)

No se si lo he explicado bien, mejor leete la referencia de PlayerPrefs http://docs.unity3d.com/ScriptReference/PlayerPrefs.html.

1 respuesta
bornex

#2 Es que no me gustaría colgar el juego en google play con ese fallo. Soy nuevo también en unity y puede ser que este haciendo algo "a lo burro" como suele ocurrir cuando empiezas con algo.

r2d2rigo

http://answers.unity3d.com/questions/233905/colliders-for-a-tile-based-game.html
http://forum.unity3d.com/threads/rigidbody-getting-stuck-on-tiled-wall.220861/
http://answers.unity3d.com/questions/626841/is-it-better-to-make-one-collider-for-a-large-land.html

TL;DR no uses un collider por tile. Usa sobre todo edge colliders para definir las paredes y suelos.

1 respuesta
bornex

#4 Muchas gracias por los links y el consejo ;).

Una pregunta tonta ¿qué significa TL;DR?

EDIT: Vale, ya se lo que es jajaja, tampoco es tan largo el post xD

EDIT2: Hola de nuevo gente, he intentado mejorar lo de las colisiones pero no he tenido existo, se me sigue quedando el character pillado en las esquinas. He mirado por todos lados y la verdad es que no se que hago mal.

Aquí teneis una foto a ver si veis algo raro.

1 respuesta
13500

#5 prueba 1 de estas 2 cosas:

1 - cambia el collision detection del rigidbody de discrete a continuous y el interpolate a extrapolate

ó

2 - convierte el rigidbody 2D en kinematic, añade un componente BoxCollider2D que contenga al sprite

1 respuesta
bornex

#6 Ok, Gracias voy a probar y os cuento.

18 días después
Thau

Utilizar físicas "reales" para juegos de plataformas normalmente da más quebraderos de cabeza de lo que ayuda. Te recomiendo que eches un vistazo a este post: http://www.learn-cocos2d.com/2013/08/physics-engine-platformer-terrible-idea/.

Aquí tienes otro recurso bastante chulo que habla de la implementación de mecánicas en estos juegos: http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-platformers/

1 respuesta
bornex

#8 Muchas gracias por los links los mirare. El caso es que lo solucione momentáneamente con círculos. Y edges. Voy a ver si lo mejoro

14 días después
E

#1 sobre la segunda cuestión que planteas, la del minimapa, sí, deberías crear una escena aparte. Para que el nivel 2 y los siguientes no estén disponibles, por ejemplo, deberías guardar el número del último nivel pasado con PlayerPrefs.SetInt cada vez que te pasas un nivel (deberías hacer una comprobación para evitar guardar valores más bajos si jugaras a un nivel anterior). Una vez en el minimapa, recuperas el ese valor con PlayerPrefs.GetInt y, según el valor obtenido, dejas accesibles o no los demás niveles.

Usuarios habituales