android - studio - Cómo trabajar con diferentes resoluciones de pantalla
resoluciones en android studio (11)
Estoy usando Unity 4.3.3 para mi juego. Estoy haciendo un juego para dispositivos Android e iOS. Como soy bastante nuevo en la unidad, parece que no puedo encontrar una manera de trabajar con una resolución de pantalla diferente. Estoy usando c # para mis scripts.
Quiero que mi juego se ejecute en pantalla completa. Lo probé en el iPad 2 y funciona perfectamente, pero para el iPhone 4 los laterales están recortados y para el iPhone 5 están recortados aún más. ¿Cuál es la solución? ¿Qué opción debo elegir en Configuración del reproductor> iOS> Otras configuraciones> Resolución de objetivos?
Debe cambiar la ventana de la cámara de acuerdo con la relación de aspecto del dispositivo. Supongamos que has hecho el juego para 720x1080
Luego en el script debes hacer
float xFactor = Screen.width / 720f;
float yFactor = Screen.height / 1080f;
Camera.main.rect = new Rect(0,0,1,xFactor/yFactor);
O
La otra forma es, si estás haciendo un juego para la relación de aspecto 9:16, entonces
Haz esto en tu script
public float targetRatio = 9f/16f; //The aspect ratio of your game
void Start()
{
Camera cam = GetComponent<Camera>();
cam.aspect = targetRatio;
}
Es muy fácil para Unity Now ya que Unity3D tiene su propio sistema de interfaz de usuario. Para 3D Unity Ajusta la cámara automáticamente con el tamaño de pantalla. El problema surge para la interfaz de usuario en realidad y es un poco complicado. En primer lugar, trate de descubrir qué elementos necesitan cambiar de posición y tamaño con el tamaño de la pantalla. Por ejemplo, si tiene un botón exactamente en el centro de la pantalla. Entonces no necesita cambiar la posición según la pantalla. Permanecerá en el centro.
Ahora tomemos un escenario en el que tenga un botón en la esquina de la pantalla como vemos el botón de pausa arriba a la derecha o arriba a la izquierda. Ahora tendrá que anclar su botón en la esquina en consecuencia. No importa en qué tamaño de pantalla se está ejecutando el juego, el botón de pausa debe pegarse a la esquina.
Ahora tomemos otro caso en el que tenga un fondo en su menú. Ahora deberás aplicar estiramiento para este sprite de BG. Esta BG se estirará y contraerá en consecuencia, pero todos los elementos tendrán un tamaño de corrección. Para esto, se recomienda tener las BG planas para que una misma BG pueda tener una buena calidad para 16:10 o 4: 3 (todo se trata de UI nativa de Unity)
Hay un activo gratuito en Asset-store con respecto a este problema ... Solo echa un vistazo ...
http://u3d.as/content/palash-bhowmick/fit-all-screen-size/9q9
si se modifica la forma de su objeto, elimine las líneas que comienzan con:
transform.localScale.x =
La manera más fácil que he resuelto esto fue como lo señaló Steven, forzar mi relación de aspecto de cámara con la que desarrollé. Por supuesto, esto deforma algunos objetos si la relación de aspecto que desarrollé es diferente a la del dispositivo. Para los objetos de la interfaz de usuario, si está utilizando la función incorporada, creo los rectángulos basados en un porcentaje del tamaño de la pantalla que sea
Rect(0.5 * Screen.width, 0.5 * Screen.height, 0.25 * Screen.width, 0.25 * Screen.height)
Eso colocará la esquina superior izquierda en el centro de la pantalla y creará un rectángulo de 1/4 de la altura y 1/4 del ancho de la pantalla. Estoy usando NGUI 2.7 para la interfaz de usuario y hasta ahora no he visto ningún problema con diferentes relaciones de aspecto, y uno usa una cámara ortográfica para representar la interfaz de usuario
Ok, esta es una gran pregunta. Muchas personas se han referido a forzar una relación de aspecto, que es una buena solución a considerar. Sin embargo, para muchos juegos esto no es apropiado. Para muchos diseños de juegos, desea que el juego se sienta como propio del dispositivo / pantalla en el que se está ejecutando, y desea utilizar cada centímetro cuadrado de pantalla de bienes raíces que pueda. Para hacer esto, debes construir y probar cada sistema en tu juego para pantallas de diferentes tamaños y formas. Es un problema muy similar a la creación de aplicaciones y sitios web para múltiples dispositivos.
Tamaño de pantalla
El tamaño de la pantalla se puede recuperar programáticamente usando el DPI y la resolution con una declaración como:
Resolution res = Screen.currentResolution;
float screenSquareInches = res.width * res.height / Screen.dpi;
Para el contenido de la pantalla que se ve a través de la cámara, solo hay una variable que debe escalarse, y ese es el tamaño de la cámara (o la cantidad de material en el mundo del juego que se va a exprimir en la pantalla). Puede controlar el tamaño de la cámara con el campo de visión para juegos 3D o el tamaño ortográfico para juegos 2D. Solo las pruebas dirán qué ecuación admite la gama más amplia de tamaños de pantalla, pero algo en este sentido podría ser útil:
// this should be a tweakable number, so you can fine tune it to your needs. It represents the screen size at which the camera size should not be scaled at all
float expectedScreenArea = 20;
// this number should also be tweakable, which declares how much smaller/larger text can get depending on the screen size. Generally larger screens are viewed from farther away, so scaling should be slight
float cameraScalingRate = 0.25f;
// multiply this number by the default/base camera size you have picked, whether that''s field of view or orthographic size
float cameraSizeMultiplier = 1 + (screenSquareInches / expectedScreenArea - 1) * cameraScalingRate;
Ok, eso debería ayudarte a escalar el mundo del juego, pero ¿qué hay de los elementos de la interfaz de usuario, cosas como texto, HUD y controles en pantalla? Bueno, para elementos como el texto, la ecuación anterior debería funcionar decentemente bien, aunque es posible que desee un valor diferente para la tasa de escalado. Para los controles en pantalla, es posible que desee una transformación más completa, como los joysticks moviéndose a las esquinas inferiores de la pantalla en una tableta en lugar de centrarlos en los lados, o si no es un dispositivo de pantalla táctil, elimine los controles en pantalla por completo. Eso está fuera del alcance de esta pregunta.
Relación de aspecto de pantalla
La relación de aspecto de la pantalla (qué ancho y alto es) también es importante y necesita su propio manejo. En general, la mejor forma de hacerlo es congelar la altura vertical de la pantalla, de modo que a medida que la pantalla se ensancha, los elementos de la pantalla no se escalen, pero a medida que la pantalla aumenta, los elementos de la pantalla se escalan proporcionalmente a la altura la pantalla crece Este es el comportamiento predeterminado para las cámaras, pero para los elementos de la interfaz de usuario debe configurarlo como tal. Esto es relativamente fácil si está utilizando el nuevo sistema de IU con canvas ''. En un componente CanvasScalar, hay una propiedad que controla cómo se escalan los elementos según la relación de aspecto. Cambie esto para que coincida con el ancho o alto, y haga que coincida con la altura.
Para una mayor consideración
Al admitir diferentes tamaños de pantalla y formas, hay más que considerar que simplemente hacer que todo encaje. También debes asegurarte de que tu juego juegue bien en las diferentes pantallas. Esto varía desde cosas tan sutiles como no hacer que el jugador se sienta claustrofóbico en una pantalla pequeña hasta asegurarse de que los enemigos no puedan dispararle al jugador si están fuera de la pantalla para asegurarse de actualizar los límites que mantienen los elementos en la pantalla. Otra cosa a considerar si se trata de un juego de PC es que alguien podría conectar su computadora a una pantalla diferente o cambiar la resolución sobre la marcha. Con esto en mente, puede ser bueno volver a ejecutar las ecuaciones anteriores según sea necesario para que el jugador no tenga que salir del juego para que las cosas se alineen nuevamente.
Puede intentar capturar la resolución del dispositivo usando Camera.ScreenWidth y Camera.ScreenHeight.
Luego, haga algunos cálculos matemáticos para calcular la diferencia de la resolución que tiene y aplíquela al objeto principal.
Esto escalará todo lo más grande / más pequeño para adaptarse a la resolución del dispositivo sin tener múltiples resoluciones de imagen, etc. para diferentes dispositivos de resolución.
Sé que es un hilo viejo, pero la gente podría terminar buscando una respuesta.
Para ajustar una cámara en perspectiva a diferentes relaciones de aspecto de pantalla con un comportamiento diferente al predeterminado de Unity, necesita algo de trigonometría. Toda la información necesaria al respecto está aquí: https://en.wikipedia.org/wiki/Angle_of_view
Si quieres una salida fácil, aquí hay una solución que funciona con todos los tipos de cámaras: http://u3d.as/oUX
Si está desarrollando un juego en 2D, es decir, su cámara está en una vista ortográfica, simplemente haga el siguiente código y conéctelo con su objeto de juego. Escalará el objeto del juego (en este caso, el sprite) con la resolución de la pantalla.
void Resize()
{
SpriteRenderer sr=GetComponent<SpriteRenderer>();
if(sr==null) return;
transform.localScale=new Vector3(1,1,1);
float width=sr.sprite.bounds.size.x;
float height=sr.sprite.bounds.size.y;
float worldScreenHeight=Camera.main.orthographicSize*2f;
float worldScreenWidth=worldScreenHeight/Screen.height*Screen.width;
Vector3 xWidth = transform.localScale;
xWidth.x=worldScreenWidth / width;
transform.localScale=xWidth;
Vector3 yHeight = transform.localScale;
yHeight.y=worldScreenHeight / height;
transform.localScale=yHeight;
}
Si su objetivo es obtener el ancho anterior:
[RequireComponent(typeof(Camera))]
public class ResizeCamera : MonoBehaviour
{
private float DesignOrthographicSize;
private float DesignAspect;
private float DesignWidth;
public float DesignAspectHeight;
public float DesignAspectWidth;
public void Awake()
{
this.DesignOrthographicSize = this.camera.orthographicSize;
this.DesignAspect = this.DesignAspectHeight / this.DesignAspectWidth;
this.DesignWidth = this.DesignOrthographicSize * this.DesignAspect;
this.Resize();
}
public void Resize()
{
float wantedSize = this.DesignWidth / this.camera.aspect;
this.camera.orthographicSize = Mathf.Max(wantedSize,
this.DesignOrthographicSize);
}
}
si no tiene otra opción, también puede Hacer un poco más de trabajo y agregar un Script especial a su cámara que:
- comprueba la resolución de pantalla para el dispositivo
- establece la resolución objetivo para ese
- y también establece la relación de aspecto objetivo para eso (IMPORTANTE)
todo lo que necesita hacer es simplemente escribir una función base para verificar la resolución de la pantalla (tanto de ancho como de alto para los dispositivos que desee) y luego agregarle más funcionalidades para establecer la resolución de pantalla y la relación de aspecto adecuadas.
unity cambia su cámara dentro del juego para que coincida con las dimensiones de la relación de aspecto de la pantalla que está usando. Obviamente, esto no siempre es deseado, así que hay un par de formas de evitar esto:
1) El primer método es muy fácil de implementar, aunque rara vez se ve bien. Simplemente puede cambiar la relación de aspecto de la cámara para que coincida con la que ha diseñado su juego. Entonces, si, por ejemplo, has diseñado tu juego a 4: 3, harías algo como esto:
Camera.aspect = 4f/3f;
Solo ten en cuenta que esto distorsionará el juego en diferentes relaciones de aspecto.
2) El otro método es un poco más complejo, pero el resultado se ve mucho mejor. Si está utilizando una cámara ortográfica, una cosa importante a tener en cuenta es que, independientemente de la resolución de pantalla que se utilice, la cámara ortográfica mantiene la altura en un valor establecido y solo cambia el ancho. Por ejemplo, con una cámara ortográfica con un tamaño de 10, la altura se establecerá en 2. Con esto en mente, lo que tendría que hacer es compensar la cámara más amplia posible dentro de cada nivel (por ejemplo, tener un fondo más amplio). ) o cambie dinámicamente el tamaño ortográfico de la cámara hasta que su ancho coincida con lo que ha creado.
Los componentes de GUI son más fáciles de implementar simplemente al establecer su posición para que dependa de la resolución de la pantalla donde sea necesario. Por ejemplo, si desea que aparezca un botón en la esquina superior derecha, simplemente configure su posición en algo como position = new Vector2(Screen.width - 50, 50);
EDITAR: Como mencionaste los dispositivos que usaste, busqué un poco la relación de aspecto que utiliza cada uno: Ipad2 = 4: 3, Iphone4 = 3: 2 y Iphone5 = 16: 9
Como dijiste que se ve perfecto en el Ipad2, supongo que has diseñado tu juego para usar una relación de aspecto de 4: 3, por lo que el "recorte" que mencionas es solo porque tu cámara ortográfica se ha ampliado. La solución es usar uno de los dos métodos que describí anteriormente.
Puede ver cómo se verá en cada dispositivo dentro del editor de unidades con bastante facilidad. Si vas a la pestaña del juego (que aparece cuando presionas jugar en el editor de unidades), verás que tiene un nombre de dispositivo, junto con una resolución y una relación de aspecto. Cambiar esto le permitirá ver cómo se verá en diferentes relaciones de aspecto.