Manejar aspecto de pantalla para diferentes resoluciones

Este script es parte de Arj2D.

Cuando se trabaja para dispositivos móviles, es normal encontrarse con un pequeño problema y más si se trabaja en 2D es que al haber tantos aspectos de pantalla entre tanto dispositivo en el mercado, es fácil que si desarrollamos nuestro juego donde en una esquina esta un objeto por ejemplo el mostrador de puntaje, al pasarlo a otro dispositivo con una dimensión diferente (Más frecuente cuando es uno de menor dimensión) el puntaje ya no aparece en pantalla o caso contrario donde la resolución es mayor el puntaje, este aparece, pero ya no en la esquina.

Para solucionar este problema sin tener que ajustar todo el contenido de nuestra(s) escena(s), podemos agregar este script a cada camera del juego y poner la resolución original con la que fue desarrollado el juego y listo.

Este funciona de 2 maneras, una es forzar la cámara para que se ajuste a la pantalla simplemente llamando “this.GetComponent<Camera>().aspect = AspectoDeseado” la desventaja de este método es que puede distorsionar un poco el render si el aspecto difiere mucho, sin embargo es el más utilizado.

La otra manera es calcular la mayor cantidad espacio de la pantalla que se puede utilizar sin forzar la distorsión y solo dibujar en esa área, sin embargo la desventaja es que en algunos dispositivos puede quedar espacio en las orillas sin usarse. Nota mi script añade una segunda cámara al usar este modo para llenar de color negro esta parte, ya que si no se añade esta segunda cámara en algunos dispositivos llena faltante como se le de la gana al diapositivo y puede generar efectos curiosos.


private void Resize()
{
 //Aspect ratio
 float targetaspect = DesignAspectWidth / DesignAspectHeight;

 //check actual aspectratio
 float windowaspect = (float)Screen.width / (float)Screen.height;

 //check actual vs wish aspect
 float scaleheight = windowaspect / targetaspect;

 if (scaleheight &lt; 1.0f) //portrait
 {
  Rect rect = GetComponent().rect;

  rect.width = 1.0f;
  rect.height = scaleheight;
  rect.x = 0;
  rect.y = (1.0f - scaleheight) / 2.0f;

  GetComponent().rect = rect;
 }
 else //lanscape
 {
  float scalewidth = 1.0f / scaleheight;

  Rect rect = GetComponent().rect;

  rect.width = scalewidth;
  rect.height = 1.0f;
  rect.x = (1.0f - scalewidth) / 2.0f;
  rect.y = 0;

  GetComponent().rect = rect;
 }

 //Create background in black
 CreateBackGround();
}

private void CreateBackGround()
{
 Camera cam = new GameObject().AddComponent();
 cam.gameObject.isStatic = true;
 cam.depth = -10;
 cam.cullingMask = 0;
 cam.farClipPlane = 1f;
 cam.orthographic = true;
 cam.backgroundColor = Color.black;
 cam.gameObject.name = "BackGround_Camera";
}

DESCARGAR SCRIPT

Arj2D

Arj2D es un framework que estoy desarrollando que trae scripts para el Editor, GameObjects, librerías y singletons que ayudan a la elaboración de proyectos en Unity orientado a 2D. Algunos scripts son compatibles con proyectos 3D, pero en si el framework esta orientado al 2D. Ya que el framework esta en desarrollo y contiene varios scripts, iré publicando aquí en el blog partes de él y así como un poco más detallada de que hacen.

El Framework es de código abierto y gratuito, y se encuentra hospedado en GitHub para que siempre puedan tener acceso a la ultima versión. Arj2D.

Si tienes un proyecto que utilice una parte de el framework, pueden decirme y lo publicare aquí.

Juegos/Proyectos que usan Arj2D:

ShoeBox y Unity – (Generador de Atlas para Unity)

ShoeBox es un programa gratuito que permite unir varias imágenes para elaborar un Atlas (Una imagen grande con varias imágenes más pequeñas), el cual los Atlas son muy útiles en el momento de trabajar en videojuegos ya que sirve mucho en la optimizan (En otro post hablare de esto). Lo mejor de todo es que es completamente gratuito.

Interfaz del programa

Aquí les agrego la imagen del antes y después de utilizar este programa. Solo debemos arrastrar todas las imagenes que queremos que se unan en una mayor a “Sprite Sheet” de ShoeBox.

Mario_shoebox

De 44 imágenes, obtenemos solo una imagen, pero conservando sus tamaños.

ShoeBoxReading (Importador de ShoeBox a Unity)

Obtenemos una imagen más grande que tiene adentro de el todas las imágenes que forman las animaciones del personaje (Mario bros) en este caso y un archivo llamado “sprites.xml” el cual usaremos para poder importarlo en Unity.

Para esto necesitaremos de un script para Unity que yo eh elaborado, el cual podemos obtener de aquí Link. Y este script tenemos que pasarlo a Unity dentro de una carpeta llamada “Editor” (Si no tenemos, la creamos). Una vez agregado pasamos agregar los 2 archivos que nos genero ShoeBox que es la imagen Atlas de Mario Bros que tenemos que asignar como Sprite y el archivo “sprites.xml”, ambos archivos podemos cambiarles el nombre. Dentro de Unity iremos a “Windows -> ShoeBoxReading -> Import” y nos mostrara una ventana que nos pedirá un Texture2D y un archivo, aquí asignaremos los 2 archivos que habremos pasado a Unity y indicamos donde queremos el pivote de los sprites y le damos en “Read”  y listo.

shoeboxreading

Listo ya tenemos nuestros sprites para poder trabajar en Unity y de manera optimizada. Ahora el archivo “sprites.xml” pueden eliminarlo (y en caso recuperarlo usar el siguiente script) o dejarlo ahí en el proyecto, al final al cabo al momento de compilar Unity ignorara este archivo y no afectara en el tamaño final de la compilación.

ShoeBoxMaked (Exportador de Unity a ShoeBox):

También eh elaborado un script que permite a partir de un Atlas, generar el archivo “sprite.xml” para poder recuperar las imágenes y separarlas con ayuda de ShoeBox. Esto en caso que hayamos eliminado el archivo “sprite.xml” y la opción de “Extract sprites”  de ShoeBox no haya dado resultado.

Para eso bajaremos el archivo ShoeBoxMaked y lo agregaremos a Unity en una carpeta llamada “Editor” y pasaremos a “Windows -> ShoeBoxReading -> ShoeBox Export” donde nos mostrara una ventana donde nos pedirá un Texture2D y aquí asignaremos el Atlas con sus sprites ya asignados de Unity y le damos en “Create” y nos genera un archivo “(Nombre del atlas).xml” en la misma carpeta donde se encuentra el Atlas que utilizamos, y ahora abrimos esta carpeta en el explorador y arrastramos estos dos archivos a la opción “Read Sprites” y obtendremos sprite como imagen separada, el proceso inverso de “SpriteSheet”.

marios

Al dar en Save almacena cada sprite como imagen independiente en la misma carpeta donde se encuentran los 2 archivos que usamos.

Preguntas (FAQ):

  • ¿Porque no generas un archivo para descargar inmediatamente?
    • Uso GitHub para compartir proyectos de codigo abierto y de esta manera si hago un cambio es fácil siempre descarguen la versión más reciente. Si prefieres puedes ir a la raiz del proyecto LINK y de lado derecho le das en “Download ZIP” y solo importa la carpeta “Editor” a Unity.
  • Unity ya tiene su generador de Atlas, ¿porque usar ShoeBox?.
    • Bueno, estos scripts los genere cuando el generador de Atlas era exclusivo de la versión PRO, pero sigo usándolo para tener un mayor control del Atlas.

Gestor de proyectos recientes en Unity

Al abrir Unity, este nos muestra una lista de todos los proyectos con los que hemos trabajado dentro de Unity. Pero con el paso del tiempo se irán acumulando y no es necesario que siempre tengamos el acceso directo a todos los proyectos. Es por eso que eh desarrollado este software que permite visualizar todos los proyectos que están en la lista de Unity de proyectos recientemente abierto y podremos seleccionar y eliminar con un clic aquellos proyectos que ya no deseemos que aparezcan en la lista.

projectlistunitymaanger

Nota: Solo lo remueve de la lista de proyectos recientes en Unity, NO elimina el proyecto del disco duro. Así si deseamos reabrir un proyecto que no se encuentre en la lista, bastara con usar el abrir proyecto.

Descargar versión para Unity 5 

Descargar versión para Unity 4

Hola Mundo!

Hola a todos, bienvenidos a mi blog. Anteriormente tenia daba mantenimiento a mi ex blog Arjïerda, pero después de un tiempo decidí reabrir otro blog, que es este Arjierda Games. Aquí estará más enfocado a la programación y más que nada al desarrollo de videojuegos. Generalmente sera sobre C++, C# enfocado a Unity y por ahí que otro lenguaje de programación. Así como explicación de algunas teorías y consejos. Espero sea de su agrado y no olviden en comentar y compartir.

También publicare sobre herramientas que vaya desarrollando y el como usarlas.