jueves, 30 de abril de 2015

Mecánica de caída I: Detección de colisiones

Una de las cosas que me faltaban de implementar en la nueva versión del juego es que cuando caigas al vacío vuelvas a aparecer en tierra, pegándote una hostia que te quite algo de vida.

La primera parte que me plantee es cómo detectar que te has caído. Es algo que parece trivial, pero no es tan sencillo. En la versión vieja iba almacenando la altura del suelo que iba pisando, y cuando detectaba que estaba muy por debajo del último suelo pisado es que me había caído. Este sistema tiene algunos problemas. Tienes que ir almacenando la altura del suelo por el que pasas, si hay alguna caída que es alta pero debe ser así para avanzar tendrás falsos positivos. Y solo funciona hacia abajo, si cambias la gravedad ya no vale y tendría que hacer un sistema bastante más complejo para que funcionase.

Entonces pensé hacerlo con colliders, poner unos objetos rodeando el escenario y si tocas alguno de ellos es que te has caído. Comencé metiendo la pieza de escenario dentro de una caja gigante. Aquí tenía dos opciones y no me gustaba ninguna. Una es poner una cada por cada trozo de escenario, pero entonces me detectaría caídas al pasar de una caja a otra (de un trozo de escenario a otro) y necesitaría comprobaciones extra. Otra sería meter el escenario completo dentro de una caja gigante, pero entonces la distancia entre algunas partes del escenario y la caja de caída sería muy grande, estaríamos demasiado tiempo cayendo, como si eso no tuviera solución. Así que descarte la caja.

Cubierta con planos

Entonces pensé en poner planos, un plano a cada lado que pueda tener gravedad, formando como una caja sin tapas, y así no tendría el problema de la transición de un trozo de escenario a otro. El problema es que el plano por defecto de Unity tiene demasiados polígonos, aunque no vaya a renderizarlos, el collider también tenía los mismos polígonos. Así que hice unos planos con 4 triángulos en 3ds max y usé esos planos. El problema es que Unity no tiene un collider de plano, tiene que ser de tipo malla. Así que incluso si la malla es tan sencilla como un plano con 4 triángulos, se supone que es menos eficiente que usar alguna otra primitiva como una caja. Y además al ser un plano podríamos atravesarlo sin que se detecte la colisión si vas muy rápido. Así que aunque como se puede ver en la foto ya lo tenía montado así, al llegar a los colliders lo descarté.

Cubierta con cubos

Y el siguiente paso fue en lugar de usar 4 planos, usar 4 cubos, con la misma configuración, viendo la imagen se ve bien la idea. Al ser cubos, con cierta altura, ya no voy a poder atravesar su collider sin que se detecte la colisión, y además es un tipo de primitiva nativa y sencilla. El problema es que los cubos chocan entre ellos, y también se puede intentar detectar colisiones contra todos los demás elementos del escenario. Para esto está la matriz de colisiones entre capas.

matriz de colisiones

Esta matriz, que está en las opciones de física, permite seleccionar entre qué capas se calculan las colisiones. Como podéis ver he hecho que la capa “Cubierta”, que es en la que están estos nuevos elementos detectores de caída solo calcula colisiones contra la capa Player. De esta forma el cálculo de si nos hemos caído nos sale barata computacionalmente.

No hay comentarios :

Publicar un comentario