Mi método es principalmente similar a las soluciones dadas por otros :) Trataré de explicar en detalle el enfoque que tomo para hacer que el juego sea independiente del tamaño de la pantalla.
Orientación de la pantalla
Dependiendo de la orientación de la pantalla (horizontal o vertical), debe considerar si la cámara escalará con una altura o ancho fijos. Principalmente elijo ancho fijo para juegos orientados al paisaje y altura fija para juegos orientados a retratos.
Escala de cámara
Como se discutió, esto puede ser altura fija o ancho fijo.
Altura fija : el área vertical del juego siempre se ajustará a la altura de la pantalla. Y a medida que cambie la relación de aspecto de la pantalla, se agregará espacio adicional a la izquierda y a la derecha de la pantalla. Para implementar esto no necesita codificar nada, es el comportamiento predeterminado de la cámara de la unidad.
Ancho fijo : el área horizontal del juego siempre se ajustará al ancho de la pantalla. Y se agregará espacio adicional en la parte superior e inferior a medida que cambie la relación de aspecto de la pantalla. Para implementar esto, necesita escribir un pequeño fragmento de código. Más adelante, asegúrese de eliminar la función de actualización del formulario de código y colóquelo en modo despierto.
using UnityEngine;
[ExecuteInEditMode]
public class ScaleWidthCamera : MonoBehaviour {
public int targetWidth = 640;
public float pixelsToUnits = 100;
void Update() {
int height = Mathf.RoundToInt(targetWidth / (float)Screen.width * Screen.height);
camera.orthographicSize = height / pixelsToUnits / 2;
}
}
En el editor, puede cambiar el ancho del objetivo para definir el área del espacio mundial que desea mostrar. Este código se explica en el siguiente video junto con muchas otras prácticas para juegos 2D :)
Unite 2014 - Mejores prácticas 2D en Unity
Relación de aspecto
La siguiente relación de aspecto enumerada del más ancho al más estrecho, cubre casi todos los tamaños de pantalla tanto para Android como para iOS
- 5: 4
- 4: 3
- 3: 2
- 16:10
- 16: 9
Por lo general, establezco todas estas relaciones de aspecto en el orden dado en la ventana del juego, ya que es útil al probar diferentes tamaños de pantalla :)
Área de gasto
Esta es el área que se agrega a la pantalla a los lados o arriba / abajo según la escala de la cámara que haya elegido.
Para una altura fija, todos los elementos del juego deben caber preferiblemente en una relación de 16: 9, que es la más estrecha. Y el fondo debe extenderse hasta que cubra la relación 5: 4. Lo que asegura que tu juego nunca tenga franjas negras a los lados.
Para un ancho fijo, es casi lo mismo, pero aquí los elementos deben caber en una relación de 5: 4 y el BG debe extenderse hasta 16: 9.
Límites
A veces no podemos usar el enfoque del área de gastos, ya que necesitamos utilizar toda la pantalla disponible para el juego.
Por ejemplo, considere un juego de retratos con altura fija, atrapando las monedas que caen del cielo. En esto, debemos darle al jugador la capacidad de moverse horizontalmente sobre el ancho de pantalla disponible.
Por lo tanto, necesitamos los límites de la cámara en términos de coordenadas mundiales para saber dónde están exactamente los lados izquierdo, derecho, superior o inferior de los clips de la cámara en la posición mundial.
También podemos usar estos límites para anclar elementos del juego o interfaz de usuario en el lado deseado de la cámara.
Usando Camera.ViewportToWorldPoint podemos obtener los límites. El espacio de Viewport está normalizado y en relación con la cámara. La parte inferior izquierda de la cámara es (0,0); la esquina superior derecha es (1,1). La posición z está en unidades mundiales de la cámara. Para 2D / ortográfico, la z no importa.
Vector3 leftBottom = camera.ViewportToWorldPoint(new Vector3(0, 0, camera.nearClipPlane));
Vector3 rightTop = camera.ViewportToWorldPoint(new Vector3(1, 1, camera.nearClipPlane));
float left = leftBottom.x;
float bottom = leftBottom.y;
float right = rightTop.x;
float top = rightTop.y;
UI
Para la IU podemos aplicar los mismos conceptos que usamos para los elementos del juego. Después de la introducción de Unity5 UI y la disponibilidad de complementos como NGUI, esto no será un gran problema :)