
Unity3D. Como hacer saltos no solapados con nuestro Player
Una problemática bastante habitual en Unity es tener dos o tres alternativas para resolver una situación. Pero la experiencia dice que en Unity normalmente sólo hay una solución buena, que funcione correctamente y además acostumbra a ser la más imaginativa. El resto de alternativas generalmente no acaban de funcionar.
Vamos a poner un ejemplo con la siguiente escena de partida:
La escena anterior está formada por nuestro Player (un cilindro) y dos plataformas con forma cúbica, situadas en diferentes niveles. Lo que se pretende es que al apretar la tecla Space nuestro Player salte y se instale encima de la plataforma1. Al volver al apretar la tecla Space, queremos que el Player se ubique encima de la plataforma2.
Nuestro Player tiene 3 elementos a destacar:
- Un componente Rigidbody, con Use Gravity activado.
- Un script que le dota de movimiento en los ejes X y Z según el toque de las teclas de dirección: Arriba, abajo, derecha e izquierda
- Un script que al pulsar la tecla Espacio hace que el player pegue un salto hacia arriba (eje Y).
La combinación de los dos scripts nos permiten que al apretar la tecla Space y moviendo adecuadamente las teclas de dirección, nuestro Player pueda posarse sobre una de las plataformas:
El problema de este código es que los AddForce se pueden ir solapando en caso de que se apriete la tecla Space de forma compulsiva, y hacer que nuestro Player se eleve de forma desproporcionada hacia el cielo sin ningún control.
En este momento nos podemos preguntar sobre las alternativas para impedir que nuestro Player se eleve de forma infinita si se hace un uso desproporcionado de la tecla Space. Podemos pensar en esperar 2 segundos dentro de la función Jump, para que el sistema deje que el Player se aposente encima de la plataforma1, después del impulso. Pero esta opción no acaba de funcionar.
La mejor alternativa para evitar solapamientos entre diversas llamadas a la función Jump es utilizar un semáforo con una variable booleana. El sistema sólo permitirá el salto si una determinada variable booleana es cierta. Y cuando se salte esta variable se pondrá a falsa. La cuestión es que situación o evento volverá a poner esa variable a true. La respuesta es cuando el player impacte de nuevo con el suelo y se quede aposentado en tierra. Esto se consigue mediante el evento OnCollisionEnter:
Sólo hace falta para que todo funcione correctamente que todos los gameobjects tipo plataforma, lleven el mismo tag ‘Ground’. De esta forma cada vez que impacta el Player con el suelo, la variable booleana se pone a cierta y vuelve a permitir el nuevo salto del Player:
Y nada más. Espero que este artículo os haya resultado interesante. Un saludo y hasta la próxima!
Dego
Gracias por su ayuda me sirvio de mucho
Magui Sanz
Gracias a ti por pasarte!
sebastian
gracias aquí pude arreglar el problema de que cada vez que presionaba espacio se alzaba es personaje
GRACIAS!!
agustin marengo
Muchas gracias me sirvio muchisimo , es lo que necesitaba
Fabrizio Franco
Me sale «error CS1061: ‘Collision’ does not contain a definition for ‘gameobject’ and no accessible extension method ‘gameobject’ accepting a first argument of type ‘Collision’ could be found (are you missing a using directive or an assembly reference?)» No sé como solucionarlo ya que si borro el Collision o lo cambio de lugar simplemente saltan diferentes errores, me ayudan?
cxtness27
Excelente, muy claro
jose lebron
Asi me gusta, Simple Y conciso