miércoles, 8 de abril de 2015

Detección de colisiones de personaje y espada

Estoy en un momento de conectar piezas, ir poniendo todo sobre la mesa y entonces es cuando veo que quedan cosas por hacer aquí, allá, cosas que no están bien migradas o que prefiero hacer de otra manera. Por eso seguramente vengan unos artículos que den bandazos de un lado para otro, lo que me voy encontrando al unir piezas.


En este caso vuelvo a tocar el tema de las colisiones. Todo surge porque una vez que tenía el personaje moviéndose y dando espadazos y al veneno ciego patrullando, era bastante lógico querer probar si se manejaba bien, si podíamos herir al enemigo de forma fácil, o él a nosotros... Y para eso necesito saber cuándo el enemigo choca con nosotros o con la espada.

El personaje ya tenía un collider de tipo capsula, aunque los brazos se salen un poco a veces de la capsula y atraviesan cosas, pero es bastante barato computacionalmente. Así que quería poner un segundo collider para la espada. Lo primero que necesitaba era separar la espada como otro modelo a parte, algo que ya expliqué en otro artículo. Teniendo ya la espada como un subobjeto del modelo, podía poner otro collider solo a la espada. Y eso hice, pero surgió un problema, el collider no estaba alineado con el modelo de la espada. Y los colliders no se pueden reorientar, solo se puede cambiar su tamaño, así que no había manera de que coincidiera. Creo que cuando cree el modelo de la espada no estaba alineada con los ejes y por eso tenía este problema.

La solución fue crear un objeto vacío que colgase de la espada y poner el collider a este objeto vacío, haciendo girar el objeto vacío entero para que coincidiera con la espada. Al final puse un collider muy sencillo, uno de tipo prisma rectangular. Al tener collider la espada hace que se choque con las paredes y ese brazo no atraviese cosas al salirse de la capsula del personaje. Aunque hay veces que falla miserablemente, y no sé por qué, pero algo mejora en global.

Teniendo todo colocado en su sitio solo me quedaba detectar por código cada tipo de colisión. Para eso al enemigo le puse también un collider, de tipo esfera, por su forma. Y cree un script para el enemigo, usando la función onCollisionEnter y preguntando por el tag del collider con el que estamos chocando distingo entre choque con el personaje y choque con la espada (y otros choques que ignoro).

Ahora solo me falta poder preguntar al personaje si estaba atacando cuando hubo el choque con la espada, porque ahora mismo si el veneno va andando a su rollo y toca la espada del personaje quieto, salta el evento que hiere al veneno, y es gracioso, pero no puedo dejarlo así. Pero para poder acceder al script del personaje desde el del veneno tengo que arreglar cosas de los scripts centrales donde se almacena todo, y me he ido por otro lado, voy a tener que apuntarme qué quería hacer de inicio a modo de migas de pan para no perderme.


1 comentario :

  1. En alguna parte de este documental sobre la "Historia de los Shoot 'em Up" hablan del área de impacto y cómo lo "trucan" para que le parezca que es mejor que lo que es y hacerlo más jugable: https://www.youtube.com/watch?v=GFNzqXFzmSQ

    ResponderEliminar