¿Se puede usar Unity 2D para hacer juegos de pixel art?

16

Estoy mirando las nuevas características 2D introducidas en Unity 4.3, y creo que podría estar perdiendo algo.

Para mí, parece que están diseñados para juegos 2D de alta resolución, donde escalar los sprites está bien, pero no es adecuado para juegos de pixel art.

Un sprite de pixel art está diseñado para mostrarse exactamente 1: 1 píxeles en la pantalla: el escalado lo destruye (el escalado lineal es una excepción, es decir, puede escalarlo 2x, 3x, 4x, etc.).

Sin embargo, no he encontrado la forma de "simplemente mostrarlo tal cual", aparentemente Unity insiste en escalarlo a la resolución que considere adecuada: puedo controlar el parámetro Camera.size y el parámetro "píxeles a unidades" del sprite , pero no pude obtener este resultado.

o0 '.
fuente
1
Si no me equivoco, el juego "Organ Trail" se realizó completamente en Unity3d, antes de 4.3.
felipe

Respuestas:

19

Este artículo ofrece algunas explicaciones útiles, incluso si eso fue antes de que saliera 4.3:

Si buscas el aspecto de "pixel art", el tamaño ortográfico de la cámara es de vital importancia; Esta es la parte más complicada de clavar 2D en Unity.

El tamaño ortográfico expresa cuántas unidades mundiales están contenidas en la mitad superior de la proyección de la cámara. Por ejemplo, si establece un tamaño ortográfico de 5, la extensión vertical de la ventana contendrá exactamente 10 unidades de espacio mundial. (Las extensiones horizontales dependen de la relación de aspecto de la pantalla).

Recuerde que su quad sprite es de 1 unidad por lado. Eso significa que el tamaño ortográfico le indica cuántos sprites puede apilar verticalmente en la ventana gráfica (dividido por 2).

Para que el pixel art se vea limpio, debe asegurarse de que cada píxel de la textura de origen del sprite se asigne 1: 1 a la pantalla de la ventana gráfica. No desea que se omitan o dupliquen los píxeles de origen, o sus sprites se verán distorsionados y "sucios". El truco para garantizar esta relación 1: 1 es establecer un tamaño ortográfico que coincida con la resolución vertical de la pantalla dividida por la altura en píxeles de un sprite.

Digamos que estás corriendo a 960x640 y estás usando sprites de 64x64. Al dividir la resolución vertical de la pantalla (640) por la altura en píxeles de un sprite (64) se obtiene 10, la cantidad de sprites de 64x64 que se pueden apilar verticalmente en 640 píxeles. Recuerde que el tamaño ortográfico es de media altura, por lo que su tamaño ortográfico objetivo en este caso será 5 (la mitad de 10). Debe tener un aspecto como este:

Si configura su tamaño ortográfico a la mitad o al doble de ese objetivo, aún puede obtener resultados utilizables, porque el tamaño vertical del sprite se dividirá de manera uniforme en el tamaño vertical de la ventana gráfica. Pero si configura incorrectamente el tamaño ortográfico, verá algunos píxeles omitidos o duplicados, y se verá muy mal:

Resolución variable

No necesita estar limitado a una única resolución fija para renderizar un pixel art limpio. La forma más sencilla de manejar resoluciones variables es adjuntar un script personalizado a su cámara que establezca el tamaño ortográfico de acuerdo con la resolución vertical actual y un tamaño de sprite conocido (fijo) :

// set the camera to the correct orthographic size
// (so scene pixels are 1:1)
s_baseOrthographicSize = Screen.height / 64.0f / 2.0f;
Camera.main.orthographicSize = s_baseOrthographicSize;

Si bien esa es una solución simple, tiene un inconveniente: a medida que disminuye la resolución de la pantalla, verá cada vez menos del mundo, y los sprites ocuparán más y más de la pantalla. Esa es la consecuencia de mantener una relación 1: 1 entre la fuente y los píxeles de la pantalla: un sprite de 64x64 ocupa más espacio aparente en 640x480 que en 1920x1200. Si esto es un problema o no, depende de las necesidades de tu juego específico.

Si desea que sus sprites sigan teniendo el mismo tamaño aparente independientemente de la resolución de la pantalla, simplemente configure el tamaño ortográfico en un valor fijo y déjelo allí independientemente de la resolución de la pantalla. El inconveniente es que sus sprites ya no tendrán una relación de píxeles de fuente a pantalla de 1: 1. Puede mitigar los efectos nocivos de eso permitiendo solo resoluciones que sean exactamente la mitad o exactamente el doble de su resolución objetivo.

(un poco de énfasis agregado)

Obviamente, esto funciona mejor si la resolución de altura es divisible por el tamaño del sprite, pero incluso cuando no lo es, todavía ofrece una buena aproximación de un resultado decente.


TL; DR :cameraSelf.orthographicSize = screenH / (float)spriteSize / 2f;

o0 '.
fuente
55
Otra cosa útil es establecer el filtrado de textura en 'Punto'.
felipe
@Felipe buen punto: me olvidé de eso porque ya lo descubrí.
o0 '.