lunes, 21 de noviembre de 2016

Peces II. Comportamiento y codificación.

El comportamiento de los peces ha sido la parte de programación más divertida del juego, debido a las premisas que se debían de tener en cuenta.

Su movimiento tenía que ser por toda la zona de agua del estanque y riachuelo y además que no chocaran entre ellos ni con el terreno que limita toda la zona. El límite vertical era la propia superficie del agua, pudiendo sacar un poco la aleta superior. En cuanto a profundidad, tenían que dejar cierta distancia con el fondo del estanque para que normalmente se movieran más por la zona superior y fueran más visibles vistos des de fuera del agua.

Aunque el objetivo no era hacer un simulador con un comportamiento muy real si que trabajamos el comportamiento para que desde fuera del agua diera un resultado creíble.

Antes de hacer el movimiento se buscamos vídeos de referencia de peces de estanque para ver su movimiento y su comportamiento, el cual es un movimiento bastante tranquilo y normalmente impredecible. Podéis ver cómo realizamos el modelo y su animación en el post donde explicamos sus animaciones.

Para los peces se utilizó un Character Controller para controlar mejor su movimiento y las animaciones según su velocidad, para que así, cuando apenas se moviera, la animación del modelo también fuera más lenta que cuando fuera más rápido.

Igual que hicimos con el ninja, los peces también tienen un componente Animator para la animación. Aunque en este caso, como se puede observar en el siguiente gráfico, la gestión de la animación era bastante más simple que el ninja.

Diagrama del componente Animator de los peces.
En este caso el modelo sólo tiene una animación, la cuál se activa siempre cuándo se mueve. Para que visualmente se vea mejor, hay una relación entre la velocidad de la animación y la velocidad del pez, así cuándo se mueve a baja velocidad la animación también es más lenta.

Para hacer un comportamiento más impredecible de los peces se utilizaron iteraciones basadas en la aleatoriedad. Así, por ejemplo, en cada iteración, el pez tiene un 60% de probabilidades de moverse hacia delante y un 70% de girar hacia la derecha o izquierda. Además también se le añade una pequeña probabilidad de movimiento vertical, para que pueda aproximarse a la superficie del agua o pueda sumergirse a cierta profundidad.

En el siguiente video se puede ver una de las primeras pruebas de movimiento, que aunque de tan cerca puede parecer robótico, buscábamos encontrar un comportamiento que desde fuera el agua quedara resultón.



En cada iteración también se controlan todos los objetos que el pez tiene a su alrededor, ya sea el propio terreno del estanque u otros peces que se mueven cerca. Dependiendo de la distancia de los objetos que tiene cerca, al pez se le mandan unas acciones a realizar. Así por ejemplo, si se está acercando al límite del estanque pues se le sube la probabilidad de rotación para que vaya girando para no chocar. Aunque intentando que este giro tampoco fuera un movimiento brusco.

Otro ejemplo sería cuando el pez se mueve en paralelo a la pared del estanque. Si está cerca de esta pared el pez ya no intenta moverse hacia allí porque lo más probable es que colisionara, por lo que o sigue recto o gira hacia dirección contraria.

Para detectar los objetos que el pez tiene cerca en cada iteración se utilizó la función Raycast de la clase Physics de unity, la cual permite, dada una dirección, trazar una línea recta hasta que colisione con un objeto y además saber el tipo de objeto y la distancia que hay hasta él. Esta información es muy útil para saber en todo momento lo que el modelo tiene a su alrededor y por lo tanto actuar correctamente para evitar colisiones.

Finalmente, también se controla la distancia del pez con la superficie del agua y con el fondo del estanque. Así podíamos hacer que siempre se moviese por la parte superior del agua.

Para la presentación final de los peces en el estanque y riachuelo, se colocaron un número de peces adecuado para que siempre se viese movimiento bajo el agua. Además se colocaron unos colliders verticales en algunas zonas para delimitar que los peces no se fueran muy lejos de su punto de partida y para que no se acumularan todos en un mismo sitio y que otros lugares del estanque se quedaras vacío.

Resultado final

En el siguiente video se muestra el movimiento final, que con el efecto de refracción del agua, nos queda un resultado bastante aceptable.



Esperamos que os haya sido útil :).

No hay comentarios:

Publicar un comentario