Noções básicas sobre pixel art no Unity 2d

10

Estou lutando para entender o básico por trás da pixel art no Unity.

Entendo o que é uma unidade e, se eu desenhar meu sprite com 16x16 pixels, devo definir o PPU como 16.

Pegue o vale de stardew, por exemplo, na imagem abaixo você pode ver claramente que o jogador não é quadrado. O criador do jogo disse que ele fez tudo em 16x16, mas como há tantos detalhes nos personagens? Certamente você não remende vários quadrados 16x16 para formar um personagem (como faria com um mapa de peças)?

insira a descrição da imagem aqui

Qual é a maneira "comum" de lidar com coisas que não são quadradas, como os caracteres da imagem. Você acabou de criar sprite 16x32 e definir o PPU para 16? Isso não parecerá estranho ao lado de sprites 16x16? Você geralmente escolhe um tamanho (ou seja, 16, 32, 64) e depois se mantém fiel a isso para tudo no jogo?

A questão visual que eu vi é essa, em que um sprite de 32x32 parece muito fora do lugar (muito nítido) ao lado de um sprite de 16x16.

insira a descrição da imagem aqui

Então, eu estou pensando, como você mistura tamanhos sem obter esse efeito, onde uma imagem parece muito mais nítida que a outra. Por exemplo, se eu quisesse que um caractere tivesse 16x32, ou qualquer valor diferente de quadrado, quando meus blocos tivessem 16x16

Green_qaue
fonte
2
A PPU não tem nada a ver com as dimensões da textura dos seus sprites, apenas decide a escala na qual eles são exibidos em relação ao seu sistema de coordenadas do mundo. Dois sprites com a mesma PPU mostrarão a mesma densidade de pixels (ou seja, o tamanho exibido de cada bloco de pixels será o mesmo de um sprite para outro quando visualizados diretamente), mesmo que as imagens tenham tamanhos completamente diferentes. Portanto, não sei ao certo o que você quer dizer com "isso não parecerá um pouco estranho" - você pode explicar exatamente qual é o problema visual que observou?
DMGregory
@DMGregory Claro, deixe-me fazer upload de uma imagem
Green_qaue 25/17/17
11
O efeito mostrado na captura de tela de exemplo ocorrerá se você juntar duas imagens com valores de PPU diferentes (ou se uma imagem tiver seus pixels dobrados / triplicados na própria textura ou se você aplicou uma escala a uma imagem, mas não a outra) . Se você furar a um valor PPU consistente e não escalam seus sprites em seguida, você vai manter uma densidade de pixels consistente
DMGregory
@DMGregory Então, se meus blocos são 16x16 e eu quero um caractere com mais detalhes (como você pode ver, o caractere 16x16 acima tem muito pouco detalhe), por exemplo 32x16, devo criar um sprite de 32x16 e manter a PPU em 16 (o mesmo como telhas)? Ou, por exemplo, se eu quisesse um elefante, talvez fosse 64x128, então eu também definiria 16 PPU?
Green_qaue 25/05
11
PPU é quantos pixels cabem em uma unidade mundial. Se você sempre deseja que seus pixels tenham o mesmo tamanho, sempre use um valor consistente de PPU. (Isso significa que um arbusto de 16x16 e um elefante de 64x128, ambos com 16 PPU, mostrarão a mesma densidade de pixels e o elefante cobrirá 32 vezes mais área da tela do que o arbusto). Era sobre isso que você estava pensando?
DMGregory

Respostas:

16

Resumindo os pontos acima, o que importa para que duas peças de pixel art correspondam é que a densidade de pixels (texels por área de tela / unidade mundial) é a mesma.

Usando alguns sprites do Stardew Valley como exemplo, podemos ver que, embora os sprites tenham dimensões de textura diferentes, eles correspondem a uma grade consistente porque cada pixel é desenhado do mesmo tamanho.

Exemplo mostrando dois sprites de tamanhos diferentes na mesma densidade de pixels.

Se pensarmos no tamanho da planta como um bloco / uma unidade do espaço mundial, podemos ver que essa unidade mede 16 pixels na horizontal e na vertical. O personagem, com o dobro da altura da planta, também cobre o dobro do número de blocos / unidades mundiais; portanto, a densidade de pixels permanece a mesma em 16 pixels por unidade mundial.

Para o Unity especificamente, ele expõe isso para você como uma configuração de pixels por unidade no inspetor de configurações de importação do Sprite . Desde que você use um número consistente aqui para todos os seus sprites, o Unity tratará automaticamente de desenhá-los no tamanho certo em seu mundo para manter essa densidade de pixels - mesmo que sejam tamanhos ímpares e não sejam dois ou exato múltiplos do tamanho do seu bloco. Portanto, neste exemplo, tanto o arbusto quanto o personagem, e todo o resto do jogo usariam um PPU OF 16.

O número exato escolhido não é grande coisa, é a consistência que mais importa. Se quisermos que cada bloco abranja 2 unidades mundiais, para que, ao editar o nível, possamos ajustar facilmente os cantos (números ímpares) e os centros dos blocos (números pares), usaríamos uma PPU de 8 para todos os nossos sprites.

Só não diminua muito . Você verá alguns artigos recomendando uma configuração PPU de 1, o que significa que um sprite de 256 pixels abrangerá 256 unidades mundiais. Embora isso possa não parecer alarmante, sistemas como a física estão sintonizados, assumindo que a maior parte do seu jogo estará acontecendo em escalas de décimos a dezenas de unidades, e aumentar sua escala pode fazer com que eles se comportem mal. Tente escolher um número de pixels que seja significativo na sua jogabilidade, como a largura do seu personagem ou o seu ladrilho. Isso também tornará sua matemática mais fácil para a programação e o design de níveis (por exemplo, "Eu quero que esse personagem trace 3 blocos corretamente, então é isso x + 3.0f")

Observe que o dimensionamento de um sprite, imagem de interface do usuário ou de seus pais usando propriedades de transformação os distorcerá desta densidade consistente de pixels, portanto, tenha muito cuidado com as propriedades de escala e mantenha a maior parte ou toda a cena em uma escala de 1,0 por simplicidade.

Um último aviso é que nada disso determina o tamanho dos sprites na tela - isso é determinado pelo tamanho da janela / tela do jogo e pelo tamanho / FoV / ângulo da câmera. Para um pixel perfeito em 2D, você também precisará garantir que a altura da sua janela seja um número inteiro múltiplo do número de pixels sprite que sua câmera vê (altura ortográfica da câmera x 2 x PPU)

DMGregory
fonte