martes, 20 de julio de 2010

Aventuras con Unity 3D - Cubos y colisiones

Siguiendo con el tema de la tésis...

Unity permite agregarle a un GameObject un cuerpo rígido, esto como me beneficia?, pues que el cuerpo rígido puede colisionar con otros objetos rígidos, y se le pueden aplicar fuerzas, como la gravedad, golpes, peso etc.

De esta forma Unity puede hacer los cálculos necesarios para saber como debería de comportarse un cubo si se deja caer desde cierta altura con cierto ángulo. Tembien Unity permite ponerle restricciones, por ejemplo si no quieres que un objeto se mueva en algún eje, pues le dices q no calcule en ese eje y listo, esto es muy útil cuando se hacen juegos en 2D.

Aclarado lo anterior la pregunta que surge es, si le pongo un cuerpo rigido a un objeto, va a interactuar con el terreno, si modifico el terreno para que tenga protuberancias, puede ocurrir que el objeto se atore con esas protuberancias?

La respuesta a la pregunta es que sí, si las protuberancias tienen un ángulo muy pronunciado el objeto no podrá cruzarlas y se atorará, así que ahora resta ver que tan pronunciadas pueden llegar a ser las protuberancias en el terreno para que se desplacen, el resultado tambien lo pueden ver en la liga de la entrada pasada.

Un requerimiento de la tésis es que se van a tener filas de objetos alineadas y avanzarán hacia un objetivo, las condiciones son las siguientes:
Deben de ser sostenidos por el terreno y moverse a la altura de las protuberancias.
No deben de chocar con otros objetos de su mismo tipo.

He aqui el intento que hice para lograrlo: Segundo Intento.

Como se puede apreciar, se logra el primer punto, sin embargo su trayectoria se ve afectada si chocan con otro cubo, es decir, no se cumple el segundo punto.

A fin de lograr que se cumpla el segundo punto tuve que hacer algo de investigación y resultó en éxito, existe un método que lo que hace es que le dice al motor que no calcule las colisiones que puedan ocurrir entre dos objetos, por lo que la tarea ahora fué el agarrar a todos los cubos y mandar llamar esa funcion pasandole como parametro todas las posibles combinaciones de cubos existentes en el mundo. La funcion se llama ignoreCollision.

Sé que suena ineficiente, sin embargo ya dentro del juego no lo es tanto, por que hice una funcion que cuando reciba un cubo llamará a la funcion ignoreCollision para todos los cubos existentes en el mundo hasta ese momento y después lo meterá a ese mismo arreglo.

El resultado puede apreciarse en el Tercer Intento, Por cierto, es dificil apreciar el cambio en este tercer intento, ya que es casi igual que el segundo, pero fijense en el comportamiento de los cubos que inician en la misma fila y verán que esos cubos si chocan entre ellos, pero no chocan contra los cubos de la fila de enfrente, en el tercer intento ya no choca ningún cubo con cualquier otro cubo.

Tercer Intento.

Bueno, espero me halla podido dar a entender, igual si tienen alguna duda o comentario al respecto, por supuesto que es bienvenida, por lo pronto nos seguimos leyendo...

No hay comentarios: