¿Por qué Unity en modo 2d emplea la escala y el tamaño otográfico predeterminado de la manera en que lo hace?


8

Anteriormente utilicé SFML, XNA, Monogame, etc. para crear juegos en 2D, donde si visualizo un sprite de 100 px en la pantalla, ocuparía 100 px . Si uso mosaicos de 128 px para crear un fondo, el primer mosaico estará en (0, 0) mientras que el segundo estará en (128, 0).

La unidad, por otro lado, tiene su propio sistema de unidades impares, escala en todas las transformaciones, píxeles a unidades, tamaño otográfico, etc., por lo que mi pregunta es doble, a saber:

  1. ¿Por qué Unity tiene este sistema por defecto para 2d? ¿Es para desarrolladores móviles? ¿Hay un gran beneficio que no estoy viendo?
  2. ¿Cómo puedo configurar mi entorno, de modo que si tengo un sprite de 128x128 en Photoshop, se muestre como un sprite de 128x128 en Unity cuando ejecuto mi juego?

Tenga en cuenta que estoy apuntando a escritorio exclusivamente.


1
Por qué sucede esto es porque Unity era un motor 3D que recientemente tenía gráficos 2D injertados. Sin embargo, cómo manejar todo es algo que me gustaría ver respuestas, para ver si alguien más tiene un mejor enfoque que yo.
jhocking

Las funciones GUI de Unity y el componente GUITexture le permiten dibujar texturas a la pantalla en tamaño nativo, directamente. docs.unity3d.com/Documentation/ScriptReference/GUI.html docs.unity3d.com/Documentation/Components/class-GuiTexture.html Si necesita más flexibilidad, su mejor opción es definir una escala consistente, como 1U = 128px, y aplíquelo consistentemente a todos sus quads / sprites / cámaras.
DMGregory

Evitaría la clase GUI de Unity; Debido a que la GUI en modo inmediato en Unity es bastante ineficiente, están creando un nuevo sistema GUI (a punto de lanzarlo en realidad, en la versión 4.6).
jhocking

Respuestas:


4

Manejar coordenadas 2D y escalar en Unity es bastante simple, pero no es obvio y, como has notado, es diferente a cómo funcionan otras herramientas de desarrollo. Por qué sucede esto es porque Unity era un motor 3D que recientemente tenía injertos gráficos 2D.

En particular, 1 unidad en Unity no es necesariamente 1 píxel en la imagen. Cuando importa imágenes como Sprites 2D, en realidad hay una configuración de píxeles a unidades que se puede hacer 1: 1, pero recomiendo dejarlo en el valor predeterminado de 100: 1 por un par de razones (el motor de física no funciona correctamente en 1: 1, y el valor predeterminado es mejor para la compatibilidad con el código de otros).

Esta configuración de escala significa que todas las posiciones se dividen por 100. Es bastante fácil siempre y cuando recuerdes siempre la escala; cuando desea mover un sprite de 256 píxeles (por ejemplo), entonces lo mueve 2.56 También puede escribir una función de utilidad para redondear números a 2 decimales / el píxel más cercano: Mathf.Round (float * 100) / 100f


En cuanto a la configuración de una cámara con píxeles perfectos, primero configúrela como una cámara ortográfica. Cuando selecciona la cámara, en su configuración hay un menú desplegable para Perspectiva o proyección ortográfica; La perspectiva significa que las cosas se verán en 3D, mientras que la ortografía muestra la escena plana. Justo debajo de este menú desplegable está Tamaño; configure el tamaño ortográfico de la cámara a la mitad de las dimensiones de píxeles de la pantalla que desee.

Por ejemplo, supongamos que desea una pantalla de 1024x768 con píxeles perfectos. Bueno, eso significa que la altura de la cámara debe ser de 384 píxeles. Divida eso entre 100 (debido a la escala de píxeles a unidades) y obtendrá 3.84 para el tamaño de la cámara. De nuevo, esa matemática es simplemente SCREEN_SIZE / 2 / 100f


(Estaba esperando para ver qué otras respuestas vienen primero, pero han pasado un par de días. He estado haciendo 2D en Unity por un tiempo usando 2D Toolkit , pero soy relativamente nuevo en las características 2D incorporadas)


2

Como dice jhocking, es el resultado de hornear zapatos 2D en un IDE 3D. Pero, hay una solución, es un poco arcano.

El primer paso es abrir la Configuración de importación de su sprite desde el panel Proyecto. Una vez que el Tipo de textura se establece en Sprite o Avanzado (Avanzado le brinda otras opciones prácticas, pero Sprite es el predeterminado si creó un proyecto 2D al principio), hay un campo Píxeles a unidades con un valor predeterminado de 100.

Estoy jugando con un sistema de mosaicos, así que estoy usando mosaicos de 16x16 píxeles y configuro Pixels To Units en 16. La matemática funciona así: Tamaño en píxeles (X o Y) / Pixels To Units = Unidades Unity en Transformar . El cubo de 16 píxeles con PTU 16 ocupa 1 unidad en el espacio Unity.

Todavía no lo he intentado, pero espero que un PTU de 1 haga que las cosas sean perfectas.

Sin embargo, la configuración de la cámara ortográfica es un poco dolor de cabeza. Una vez más, se basa en esa configuración de píxeles a unidades, pero también en algunas otras cosas. Básicamente, es la mitad de la altura de la pantalla desde la Configuración del reproductor (es decir, 1080, 768, sea lo que sea el iPhone 5, no puede molestarse en buscarlo) dividido por Píxeles a unidades.


1

Las unidades de píxeles no son una buena forma de representar mundos grandes debido a la forma en que funcionan los números de coma flotante. Con números de coma flotante, pierde precisión con números muy grandes. Los números que están cerca de 0 tienen la mejor precisión. Por lo tanto, algunos motores de juegos tienden a preferir el sistema de métricas MKS (Metros / Kilogramos / Segundos). La unidad se establece por defecto en metros, por lo que los personajes del juego se pueden representar fácilmente como 1.0-2.0 metros de altura con muy buena precisión.

El peso y la altura promedio de un hombre humano es de aproximadamente 50 kg y 1.8 metros de alto. Si intentaras crear un personaje que tenga 1200 píxeles de alto, su peso sería de aproximadamente 33,000 unidades de píxeles. Si luego quisiera agregar un objeto muy pesado como un autobús a un juego, tendría una gran cantidad de unidades de píxeles. Puede ver fácilmente cómo esto podría conducir a cálculos muy imprecisos para colisiones.

Si está muy decidido a usar unidades de píxeles, puede calcular fácilmente la relación píxeles a metros.


Pero todo esto no se aplica a la mayoría de los juegos 2D que apenas necesitan usar la física. El problema es que Unity sugiere soporte para 2D, pero es muy rudimentario y requiere mucho estudio para simplificar lo que realmente necesita de un motor 2D.
Kokodoko
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.