Jump to content
Sign in to follow this  
MaanuRP

Reescalado 2D

Recommended Posts

Hola a todos!

Antes que nada, quiero decir que lei este post y lo que necesito es algo similar pero varia en algo importante: 

El usuario fenixelian dice que no importa que sus sprites se deformen. Por lo que mi cuestion es que prefiero que se creen los tipicos bordes negros alrededor de la pantalla que deformarse los sprites.

Llevo pensando en esto unas horas y no logro darme cuenta. Mi monitor secundario tiene resolucion 16:10 y el principal 16:9. Y no se si estoy viendo mal pero hay juegos que en ninguno de los dos me hace los bordes negros ni me deforma los modelados. Esto no puede ser, supongo que me estará deformando los mismos muy levemente y por eso no lo puedo apreciar.

Entonces mi duda es. ¿Cual es la logica para programar esta parte tan inicial y basica de todos los juegos? ¿Se debe programar en 16:9 y hacer que se reescale a cualquier resolucion sin importar que se deformen los sprites o crear las famosas barras negras? Digo 16:9 porque es el estandar (o supongo que deberia) de hoy en dia.

Llevo dandole vueltas a esto y no logro decidirme. Lo que es el HUD me queda perfecto. Con el canvas y el canvas scaler es demasiado simple hacer que se reescale y quede bien. Pero al hacerlo con sprites, estos se mueven o no quedan ocupando la misma porcion de pantalla que antes.

Mucho de esta respuesta la tengo en el post nombrado anteriormente, pero tambien necesito documentarme e informarme sobre que es lo correcto, si restringir las resoluciones elegibles a una relacion de aspecto en particular y crear los bordes negros. Si permitir todas las resoluciones y reescalar todo, si es 16:9. Todo esto.

Desde ya, muchas gracias! Espero haberme explicado bien.

Saludos!

PD: Mi forma de cambiar la resolucion es la siguiente:

Screen.SetResolution(resolutions[resolutionDropdown.value].width, resolutions[resolutionDropdown.value].height, fullscreenToggle.isOn, resolutions[resolutionDropdown.value].refreshRate);
cameraUsed.orthographicSize = Screen.height / pixelsToUnits / 2;

Pero tengo un problema. Eso lo tengo en un evento de presionar un UI Button. Pero tengo que apretarlo dos veces. Ya que la primera me cambia la resolucion pero no las cosas que estan en pantalla, es algo muy raro.

Dejo un GIF donde si prestan atencion se puede ver lo que digo, que al apretar dos veces en OK, primero cambia la resolucion y despues los objetos que no forman parte del HUD.

https://gyazo.com/19b6394b7e909d4a5439d665e643c3a1

Edited by MaanuRP

Share this post


Link to post
Share on other sites

No es un tema de hacerlo en un aspect ratio u otro, es un tema de hacerlo en una resolución, tomarla como referencia. Luego decirle en los RectTransform donde quieres que aplique el escalado -todos los ejes, deformado pero válido para algo que llene toda una zona-,  o un eje solamente para que nos los deforme y marcar que mantenga el aspect ratio en la imagen. Yo para todas las imágenes de Canvas utilizo solamente el eje X en este caso. Y dejar que el Canvas y el Canvas.scaler realicen el escalado.

Share this post


Link to post
Share on other sites
hace 9 horas, iRobb said:

No es un tema de hacerlo en un aspect ratio u otro, es un tema de hacerlo en una resolución, tomarla como referencia. Luego decirle en los RectTransform donde quieres que aplique el escalado -todos los ejes, deformado pero válido para algo que llene toda una zona-,  o un eje solamente para que nos los deforme y marcar que mantenga el aspect ratio en la imagen. Yo para todas las imágenes de Canvas utilizo solamente el eje X en este caso. Y dejar que el Canvas y el Canvas.scaler realicen el escalado.

Hola iRobb, gracias por tu respuesta. Por lo que entendi de tu respuesta. Todos mis objetos que no forman parte del HUD tambien tienen que ser hijos del canvas y cambiarle el componente transform por el RectTransform? Perdon si son dudas muy tontas, pero sinceramente nunca hice algo de este estilo en ningun lenguaje ni motor.

En cuanto mi segunda duda, ¿ese codigo esta bien para cambiar la resolucion de mi juego? Ya que la formula del size de la camara no la pensé yo. Mi problema es, como ya lo dije. Tengo que apretar dos veces el boton para que se cambie todo, es muy raro.

PD: Tengo una consutla en cuanto a la camara. Está bien que modifique el size? Estoy pensando, eso modifica solamente el aspect ratio o una persona en Full HD va a ver mas parte de la scene que otra persona que tenga 16:9 pero una resolucion menor?

Edited by MaanuRP

Share this post


Link to post
Share on other sites

El size de la cámara? Al Field of View te refieres, a la distancia en z?

Mayor resolución, mayor cantidad de píxeles, siendo entonces más pequeños en un mismo espacio. Por tanto, mayor cantidad de "visión".

Pero no debería preocuparte la resolución que se utilice, sino la resolución de referencia (la máxima normalmente) para crear tus componentes gráficos y que mantengan el aspect ratio o no, mipmaps o no, etc. dependiendo de lo que te interese. Luego ya se reescalará con el canvas scaler.

Share this post


Link to post
Share on other sites
hace 11 horas, iRobb said:

El size de la cámara? Al Field of View te refieres, a la distancia en z?

Mayor resolución, mayor cantidad de píxeles, siendo entonces más pequeños en un mismo espacio. Por tanto, mayor cantidad de "visión".

Pero no debería preocuparte la resolución que se utilice, sino la resolución de referencia (la máxima normalmente) para crear tus componentes gráficos y que mantengan el aspect ratio o no, mipmaps o no, etc. dependiendo de lo que te interese. Luego ya se reescalará con el canvas scaler.

No no, como dije en el nombre del post, estoy hablando de un juego en 2D. Por eso hablo del size de la camara. Por lo que estuve leyendo en internet se modifica con la funcion que dejé escrita mas arriba.

Mi problema es que los objetos quedan movidos, cosa que no me pasa con el HUD. ¿Esto es porque hago algo mal o porque al cambiarse el size de la cámara se ve distinto? Porque estoy intentando solucionar eso y capaz que es lo normal.

Mi otro problema es que, como se ve en el gif que pase, tengo que dar dos veces en el boton para que se cambie la resolucion, ya que la primera vez solo se cambia la resolucion en si y la segunda es cuando cambian los objetos. En el GIF se puede ver bien.

Este es el codigo:

    void Awake()
    {
        resolutions = Screen.resolutions;
 
        resolutionDropdown.options.Clear();
        List<Dropdown.OptionData> listDropdown = new List<Dropdown.OptionData>();
        for (int i = 0; i <= resolutions.Length - 1; i++)
        {
            Dropdown.OptionData optionDropdown = new Dropdown.OptionData();
            optionDropdown.text = resolutions[i].ToString();
 
            listDropdown.Add(optionDropdown);
        }
        resolutionDropdown.AddOptions(listDropdown);
        displayInfo();
    }
 
    public void onButtonPressed()
    {
        Screen.SetResolution(resolutions[resolutionDropdown.value].width, resolutions[resolutionDropdown.value].height, fullscreenToggle.isOn, resolutions[resolutionDropdown.value].refreshRate);
        cameraUsed.orthographicSize = Screen.height / pixelsToUnits / 2;
        displayInfo();
    }
 
    void displayInfo()
    {
        debugText.text = "Resolution: " + Screen.currentResolution.width + "x" + Screen.currentResolution.height + "\nRefresh Rate: @ " + Screen.currentResolution.refreshRate + "hz " + "\nFullscreen: " + Screen.fullScreen + "\nCamera Size: +" + cameraUsed.orthographicSize.ToString();
    }

¿Puedes ver el error?

Share this post


Link to post
Share on other sites

Ahora que comentáis todo esto del escalado, se me está ocurriendo una forma de re-escalar las cosas, mediante una referencia de Canvas:

  1. Se crea un Canvas+CanvasScaler que servirá para alojar los 'sprites' con el tamaño y aspectos correctos para nuestro juego. Es la referencia de tamaños.
  2. Se crean allí dentro copias de los sprites de nuestro juego, usando RawImage o Image de Unity2D. Prepararemos un set con los personajes, objetos, y decorados de escenario.
  3. Mediante un pequeño script en el Awake o en el Start, procesamos los sprites reales del juego para que se escalen exactamente a las dimensiones que tienen sus respectivas referencias...

Es decir, podemos hacer que sea nuestro CanvasScaler quien mande sobre los tamaños de los sprites, para no tener que tocar la Cámara, ni crear scripts adicionales de control de resoluciones o aspectos, etc...

 

Obviamente, podemos seguir usando lo que tenemos previsto para asegurar el pixel perfect,  pero ya que nos han dado el CanvasScaler, igual es buena idea aprovecharlo como herramienta para referencias de escalado de los sprites, usando cotnroles de UI.

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...