viernes, 30 de enero de 2015

Nuevo sistema de control usando SuperCharacterController



El control del juego no me gustaba, sobre todo porque hacía muy frustrantes las secciones de salto, los saltos con un salto de altura única (aunque a veces salta más o menos de forma extraña), y en 4 direcciones, no en direcciones libres. Por eso comencé a buscar tutoriales para ver cómo se las apañaban para hacer un control de este tipo para rehacer el mío.

Así, a través de diversas búsquedas, paseos por los foros y páginas de google llegué al blog de Erik Ross. Me pareció muy interesante pues dedica 4 o 5 entradas a describir problemas con la detección de colisiones y movimiento en Unity y en su controlador de personaje por defecto. Y resulta que tenía muchos más problemas por el lado de las colisiones de lo que creía. El blog requiere un cierto conocimiento de matemáticas (e inglés), pero está muy bien. Se ve que está haciendo un remake HD del Mario 64, y aprovecha para ir explicando las cosas que está haciendo, a día de hoy casi todo referido al controlador del personaje.

Por ejemplo uno de los temas que explica, acompañado de gráficos muy útiles, es por qué con el controlador de personaje de Unity, al bajar cuestas, el personaje baja a trompicones, como si andase en plano y cada cierto tiempo se diera cuenta que está en el aire y cayera un poquito. Y desde luego en la solución de controlador que ofrece las bajadas se hacen de forma suave.



Ofrece su solución junto a una demo, y es lo que se puede ver al principio del vídeo. Las 3 bolas son las 3 esferas con las que detecta las colisiones (en lugar de utilizar un capsule collider), así que evidentemente no se verán en la versión final, ni tampoco las líneas que dibujan las colisiones detectadas, ni representación de la máquina de estados de arriba a la izquierda. El modelo es un cilindro con una caja por cara, para que sepamos en qué dirección mira.

El suelo de la demo es un modelo, no es terreno, como nos podemos imaginar por sus paredes de 90º. Y he probado a poner un terreno y funciona, no te caes ni nada, aunque no detecta igual de bien las colisiones. Una excusa más para cambiar mi primera pantalla de terreno a modelo. Los controles que se ofrecen son movimiento por el plano con las flechas, botón del salto y control de la cámara con el ratón (lo que sería fácilmente trasladable a un segundo joystick). Lo del control de la cámara me sobra, aunque he conseguido adaptar el control de gravedad a una cámara libre, mi principal problema. Pero después de tanto trabajo voy a seguir con mi cámara sobre raíles. Aunque como me de muchos problemas a lo mejor me planteo tirar de esta solución de cámara libre.

Y probando me encontré un fallo, si intentas subir por una pendiente te resbalas, pero el jugador seguirá intentando subir de forma indefinida, aunque no pulses ningún botón. Esto se debe a que el movimiento de avance se almacena en local en la máquina de estados, y la fuerza de gravedad aplicada a la pendiente se hace de forma física aparte, por lo que ese impulso de caer por la pendiente no se almacena en nuestro movimiento, no ganamos ese impulso, así que al llegar abajo seguimos teniendo la fuerza “escaladora” original y volvemos para arriba. El propio autor del sistema ha subido una versión mejorada, con una mejor detección del suelo que mira si estamos sobre una cuesta y así lo toma como andar y no como caída, pero seguimos sin ganar el momento de inercia al caer. Yo he tomado una solución más sencilla, anular el movimiento previo al finalizar una caída. Tampoco arregla el problema de la inercia al caer, pero eso es bastante más complejo, y tampoco quiero que mi personaje se deslice por las cuestas culo abajo como en el Mario 64, y desde luego así rompo el bucle infinito de intentos de escalada.

También se puede ver en el vídeo que el personaje siempre encara la dirección de la cámara, es decir nunca le podemos ver la cara, así que ese ha sido otro de los cambios que he hecho, ahora el personaje encara la dirección hacia la que anda (como Mario o Crash) y no puede andar de lado como los personajes de FPS.

También he cambiado la mecánica del salto. El salto por defecto es de altura única, siempre saltas lo mismo, y me gustaría que se pudiera ajustar más, para que el jugador tenga más control en las partes de plataformas. He seguido el sistema de mario, desde los juegos originales de NES, si pulsas el botón y sueltas en seguida salta poco, y si lo mantienes pulsado salta más, según cuánto pulses. Y de ahí que haya una parte en la primera pantalla con obstáculos cada vez más altos, para que te des cuenta que si dejas pulsado saltas más alto y puedes con esos obstáculos. Seguramente copie ese sistema de aprendizaje sin tutorial de mierda, o lo intente. Volviendo al salto, ahora calculo un salto mínimo y uno máximo, y si el botón queda pulsado se va aumentando la fuerza vertical hasta llegar a la fuerza máximo en el tiempo máximo de pulsación: medio segundo. Puede que modifique un poco los valores para ajustar los saltos, pero el sistema quedará así.

Estas son las variaciones más sencillas que he hecho del controlador y su presentación, en el próximo artículo hablaré de lo último que se ve en el vídeo, la parte jodida, el cambio de gravedad.

No hay comentarios :

Publicar un comentario