O Unity 2D pode ser usado para criar jogos de pixel-art?

16

Estou olhando para os novos recursos 2D introduzidos no Unity 4.3 e acho que posso estar perdendo alguma coisa.

Para mim, parece que eles foram projetados para jogos 2D de alta resolução, onde a escala dos sprites é boa, mas não é adequada para jogos de pixel-art.

Um sprite de pixel-art é projetado para ser exibido exatamente 1: 1 pixels na tela: o dimensionamento o destrói (o dimensionamento linear é uma exceção, ou seja, você pode dimensioná-lo 2x, 3x, 4x etc.).

No entanto, não encontrei nenhuma maneira de "apenas exibi-lo como está", aparentemente o Unity insiste em escalá-lo para a resolução que achar melhor: posso controlar o parâmetro Camera.size e o parâmetro "pixels em unidades" do sprite , mas não consegui obter esse resultado.

o0 '.
fonte
1
Se não estou errado, o jogo "Organ Trail" foi feito inteiramente no Unity3d, antes do 4.3.
Felipe

Respostas:

19

Este artigo fornece algumas explicações úteis, mesmo que isso tenha ocorrido antes da versão 4.3:

Se você optar pela aparência de "pixel art", o tamanho ortográfico da câmera é de importância crítica; essa é a parte mais complicada de pregar 2D no Unity.

O tamanho ortográfico expressa quantas unidades mundiais estão contidas na metade superior da projeção da câmera. Por exemplo, se você definir um tamanho ortográfico de 5, as extensões verticais da viewport conterão exatamente 10 unidades de espaço no mundo. (As extensões horizontais dependem da proporção da tela.)

Lembre-se de que seu quad sprite é de 1 unidade para um lado. Isso significa que o tamanho ortográfico indica quantos sprites você pode empilhar verticalmente na janela de exibição (dividida por 2).

Para dar uma aparência limpa à pixel-art, você precisa garantir que cada pixel da textura de origem do sprite seja mapeado 1: 1 para a exibição da janela de exibição. Você não deseja que os pixels de origem sejam pulados ou dobrados, ou seus sprites parecerão distorcidos e "sujos". O truque para garantir essa proporção de 1: 1 é definir um tamanho ortográfico que corresponda à sua resolução de tela vertical dividida pela altura do pixel de um sprite.

Digamos que você esteja rodando a 960x640 e usando sprites de 64x64. A divisão da resolução vertical da tela (640) pela altura do pixel de um sprite (64) gera 10, o número de sprites de 64x64 que podem ser empilhados verticalmente em 640 pixels. Lembre-se de que o tamanho ortográfico tem meia altura; portanto, o tamanho ortográfico alvo nesse caso será 5 (metade de 10). Deve ficar assim:

Se você definir seu tamanho ortográfico para metade ou o dobro desse destino, ainda poderá obter resultados utilizáveis, porque o tamanho vertical do sprite ainda será dividido uniformemente no tamanho vertical do visor. Mas se você definir o tamanho ortográfico incorretamente, verá alguns pixels saltados ou dobrados, e com uma aparência muito ruim:

Resolução Variável

Você não precisa se limitar a uma única resolução fixa para renderizar pixel art limpo. A maneira mais simples de lidar com resoluções variáveis ​​é anexar à sua câmera um script personalizado que defina o tamanho ortográfico de acordo com a resolução vertical atual e um tamanho de sprite conhecido (fixo) :

// 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;

Embora essa seja uma correção simples, ela tem uma desvantagem: à medida que a resolução da tela diminui, você verá cada vez menos o mundo, e os sprites ocuparão cada vez mais a tela. Essa é a consequência de manter uma proporção de 1: 1 entre os pixels de origem e de tela: um sprite de 64x64 ocupa mais espaço aparente em 640x480 do que em 1920x1200. Se isso é um problema ou não, depende das necessidades do seu jogo específico.

Se você deseja que seus sprites permaneçam com o mesmo tamanho aparente, independentemente da resolução da tela, basta definir o tamanho ortográfico para um valor fixo e deixá-lo lá, independentemente da resolução da tela. A desvantagem é que seus sprites não terão mais uma proporção de pixel de origem: tela de 1: 1. Você pode atenuar os efeitos negativos disso, permitindo apenas resoluções que são exatamente metade ou exatamente o dobro da resolução-alvo.

(alguma ênfase adicionada)

Obviamente, isso funciona melhor se a resolução da altura é divisível pelo tamanho do sprite, mas mesmo quando não é, ainda oferece uma boa aproximação de um resultado decente.


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

o0 '.
fonte
5
Outra coisa útil é definir a filtragem de textura como 'Point'.
Felipe #
@ Felipe bom ponto: eu esqueci disso, porque eu já descobri.
o0 '.