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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.