Parking 3D en Unity

Abr 17

Parking 3D en Unity

Devilish guys

En el mes de Febrero desarrollé un videojuego para Devilish Games, se trató de un juego de aparcar coches llamado Shopping Mall Parking, si habéis seguido el enlace veréis que se trataba de un juego Flash hecho con Away 3D y que había que portar al famoso engine Unity.

La verdad es que me gusta trabajar con el equipo de Devilish, buenas dosis de sentido del humor mezcladas con una pizca de sabiduría, la que dá el llevar muchos en la industria y, mucho saber hacer, profesionalidad ante todo.

Portar: preparación de assets

Dicho esto, paso a comentar un poco lo que tuve que hacer en este encargo, básicamente era crear de cero el proyecto en Unity basándome en los assets modificados para la versión móvil.
Lo primero que hice fué procesar y optimizar los modelos 3d, los materiales (shaders), las texturas y sprites, etc. para que hubiera el menor número de polígonos y materiales y que los shaders fueran los más eficientes para móviles, tuve que retocar alguno a mano, creando shaders “unlit” con soporte de sombras, modificar geometría, soldar vértices, crear imágenes,animaciones de offset en coordenadas de texturas de materiales, etc. para adaptarlo a Unity.

El motor

Lo bueno de AS3 y Flash con el engine Away 3D es que te deja hacer cosas que Unity no te deja, lo malo es que tienes que currarte muchas cosas a mano, el código original no pude usarlo porque no tenía sentido hacerlo sin embargo me dí cuenta del gran esfuerzo que supuso montarlo.

Cuando usas un engine debes conocerlo bien para saber como optimizar el funcionamiento del juego que haces, Away no lo conozco mucho pero Unity y el que escribe se van conociendo mejor con el tiempo.
Ambos sabemos lo que nos gustan las cosas que se automatizan sólas, y esto se traduce como batching de objetos estáticos y dinámicos. En este caso en concreto, para los coches aparcados, siendo estos reducidos a una única malla con una única textura para cada coche. Aunque ya puestos, lo óptimo habría sido haber hecho un gran atlas con todos los coches en él y un único material para todo, reduciendo así el número de llamadas de dibujo hasta una única para todos ellos. Aún así, con todos los coches colocados ya había una reducción de 13 dc (drawcalls) de media, lo cual está bastante bien.

Lista de optimizaciones

Otras técnicas de optimización del videojuego usadas fueron:
* Colisionadores básicos en lugar de usando la geometría de los modelos,siendo los mejores las esferas.
* Código escrito en C# y con muy pocas clases que gestionan todo de forma eficiente, nada de usar una clase para cada coche del parking, eso haría muchísimas entradas en la pila de llamadas y ralentizaría el juego.
* Colocación de coches en el parking usando un algoritmo sencillo y objetos estáticos que no consumen nada.
* Simplificación y optimización de objetos prefabricados para colocarlos en tiempo real.
* Precarga de texturas para optimización del uso de memoria.
* Colecciones de objetos reutilizables, en lugar de destruir y crear el mismo objeto una y otra vez ,se reutilizan, es una técnica también conocida como “object pooling”.
* Reducción de objetos físicos del juego y eventos.
* Iluminación dinámica controlada con shaders y capas de bits (sólo unos materiales de objetos son marcados para proyectar sombras sobre sólo los objetos de esa máscara o capas de bits).
* No usar buffers de 32bits,24bits ni la opción de rendering multihebra ya que puede dar problemas en dispositivos con GPU’s especiales, como pueden ser Samsung sobre todo.
* Gestión del flujo del juego con variables estáticas y estados.

Física de coches

Al principio no conocía bien la física nueva (específica) de coches para Unity, añadieron en las últimas versiones unos colisionadores para ruedas (WheelCollider), materiales de tipo asfalto, motores, etc.
Por lo que me puse al día y creé el primer prototipo en la primera semana, parece que todo funcionaba, hubo que ajustar algunos parámetros, véase: velocidad, peso, resistencia del aire, fuerza centrípeta y centrífuga, fuerza del motor, coeficiente de resistencia del material de ruedas en contacto con material de asfalto, etc. , para cada coche.
Se suelen usar los “layers” o capas para poder identificar qué cocha con qué y poder controlarlo en código, de esta manera puedes aplicar fuerzas, reducir la salud del coche en función del material de colisión y la velocidad,etc.

Soporte táctil

Para hacer las primeras pruebas implementé los controles para teclado y ratón, después con soporte táctil y sensores (acelerómetros), de forma que el juego detectaba sobre qué plataforma se ejecutaría, cambiando así su método de control.
En función de este, se dibuja una interfaz u otra, responde a unos botones u otros,etc. Hay que tener en cuenta el uso del aspect ratio que depende de la resolución de los diseños que me pasaron, para que el aspecto sea muy parecido en dispositivos con diferentes resoluciones. A esto hay que añadirle el tema de la sincronización y muestra de anuncios, ya que la publicidad es el modo de negocio de este encargo hay que tener en cuenta desde el principio del desarrollo, el diseño orientado a colocar banners, anuncios a toda pantalla, etc. Además el juego lleva una tabla de puntuaciones usando GameCenter y Google Play Services.

En resumen, fué algo más de un mes de duro trabajo pero contento de haber colaborado con Devilish en uno de sus juegos y hacer historia, por cierto, salgo en los créditos :]

El juego: Shopping Mall Parking

Aquí tenéis el trailer del juego:

Y este es el enlace a su movimiento social.

Descargar gratis en Google Play
Descargar gratis en AppStore

🙂

Artículos relacionados

  • ...

Exprésate dejando un comentario:

Introduce el captcha

Por favor escriba los caracteres de la imagen captcha en el cuadro de entrada