Por que o Unity no modo 2D emprega escala e o tamanho otográfico padrão da maneira que faz?

8

Anteriormente, usei SFML, XNA, Monogame etc. para criar jogos em 2D, onde, se eu exibir um sprite de 100px na tela, ele ocupará 100px . Se eu usar blocos de 128px para criar um plano de fundo, o primeiro bloco estará em (0, 0) enquanto o segundo estará em (128, 0).

A unidade, por outro lado, possui seu próprio sistema de unidades ímpares, dimensionando todas as transformações, pixel-para-unidades, tamanho otográfico, etc. etc. Portanto, minha pergunta é dupla, a saber:

  1. Por que o Unity possui esse sistema por padrão para 2d? É para desenvolvedores móveis? Existe um grande benefício que não estou vendo?
  2. Como posso configurar meu ambiente, para que, se eu tiver um sprite de 128x128 no Photoshop, ele seja exibido como um sprite de 128x128 no Unity quando executar o jogo?

Observe que estou segmentando exclusivamente computadores.

Neófito
fonte
11
O motivo disso acontecer é porque o Unity era um mecanismo 3D que recentemente tinha gráficos 2D enxertados. Como lidar com tudo, no entanto, é algo que eu gostaria de ver respostas, para ver se alguém tem uma abordagem melhor do que eu.
jhocking 20/05
As funções da GUI do Unity e o componente GUITexture permitem desenhar texturas diretamente na tela em tamanho nativo. docs.unity3d.com/Documentation/ScriptReference/GUI.html docs.unity3d.com/Documentation/Components/class-GuiTexture.html Se você precisar de mais flexibilidade, sua melhor aposta é definir uma escala consistente - como 1U = 128px - e aplique-o de forma consistente a todos os seus quads / sprites / câmeras.
DMGregory
Eu evitaria a classe GUI do Unity; como a GUI do modo imediato no Unity é bastante ineficiente, eles estão construindo um novo sistema de GUI (prestes a liberá-lo, na versão 4.6).
Jhocking 31/05

Respostas:

4

O tratamento de coordenadas 2D e o dimensionamento no Unity é bastante simples, mas não óbvio, e como você notou, é diferente de outras ferramentas de desenvolvimento. Por que isso acontece é porque o Unity era um mecanismo 3D que recentemente incorporou gráficos 2D.

Em particular, 1 unidade no Unity não é necessariamente 1 pixel na imagem. Quando você importa imagens como Sprites 2D, na verdade há uma configuração de Pixels para unidades que pode ser feita 1: 1, mas eu recomendo deixá-la no padrão 100: 1 por duas razões (o mecanismo de física não funciona corretamente em 1: 1 e o padrão é melhor para compatibilidade com o código de outras pessoas).

Essa configuração de escala significa que todas as posições são divididas por 100. É bem fácil, desde que você sempre se lembre da escala; quando você deseja mover um sprite de 256 pixels (digamos), mova-o 2.56 Você também pode escrever uma função de utilidade para arredondar números com 2 casas decimais / o pixel mais próximo: Mathf.Round (float * 100) / 100f


Quanto à configuração de uma câmera com pixel perfeito, primeiro defina-a como uma câmera ortográfica. Quando você seleciona a câmera, nas configurações há um menu suspenso para projeção em perspectiva ou ortográfica; perspectiva significa que as coisas parecerão 3D, enquanto a ortografia exibe a cena horizontalmente. Logo abaixo desse menu suspenso está o tamanho; defina o tamanho ortográfico da câmera para metade das dimensões de pixel da tela que você deseja.

Por exemplo, digamos que você queira uma tela de 1024x768 com pixel perfeito. Bem, isso significa que a altura da câmera deve ser 384 pixels. Divida isso por 100 (devido à escala de pixels em unidades) e você terá 3,84 para o tamanho da câmera. Novamente, essa matemática é simplesmente SCREEN_SIZE / 2 / 100f


(Eu estava esperando para ver quais outras respostas viriam primeiro, mas já faz alguns dias. Estou fazendo 2D no Unity há algum tempo usando o 2D Toolkit , mas sou relativamente novo nos recursos 2D integrados)

jhocking
fonte
2

Como o jhocking diz, é o resultado da troca de sapato 2D em um IDE 3D. Mas, existe uma solução, é um pouco misteriosa.

O primeiro passo é abrir as Configurações de importação do seu sprite no painel Projeto. Depois que o Tipo de textura é definido como Sprite ou Avançado (Avançado oferece outras opções úteis, mas o Sprite é o padrão se você criou um projeto 2D no início), há um campo Pixels em unidades com o padrão 100.

Estou mexendo com um sistema de blocos, então estou usando blocos de 16x16 pixels e defino Pixels como Unidades como 16. A matemática funciona assim: Tamanho em pixels (X ou Y) / Pixels em Unidades = Unidades de unidade na transformação . O cubo de 16 pixels com PTU 16 ocupa 1 unidade no espaço do Unity.

Ainda não tentei, mas espero que um PTU de 1 torne o pixel perfeito.

A configuração da câmera ortográfica é um pouco de dor de cabeça. Mais uma vez, ele se baseia na configuração Pixels em unidades, mas também em algumas outras coisas. Basicamente, é metade da altura da tela nas Configurações do Player (por exemplo, 1080, 768, seja qual for o iPhone 5, não se preocupe em procurá-lo) dividido por Pixels em Unidades.

PatrionDigital
fonte
1

As unidades de pixel não são uma boa maneira de representar grandes mundos devido à maneira como os números de ponto flutuante funcionam. Com números de ponto flutuante, você perde precisão com números muito grandes. Números próximos a 0 têm a melhor precisão. Assim, alguns mecanismos de jogo tendem a preferir o sistema de métricas MKS (metros / quilogramas / segundos). O padrão da unidade é metros, para que os personagens do jogo possam ser facilmente representados com 1,0-2,0 metros de altura com muito boa precisão.

O peso e a altura médios de um macho humano são de cerca de 50 kg e 1,8 metros de altura. Se você tentasse criar um personagem com 1200 pixels de altura, seu peso seria de cerca de 33.000 unidades de pixels. Se você quisesse adicionar um objeto muito pesado, como um ônibus, a um jogo, teria um grande número de unidades de pixels. Você pode ver facilmente como isso pode levar a cálculos muito imprecisos para colisões.

Se você estiver determinado a usar unidades de pixel, poderá calcular facilmente a proporção de pixels para metros.

LVBen
fonte
Mas tudo isso não se aplica à maioria dos jogos 2D, que nem sequer precisam usar a física. O problema é que o Unity sugere suporte para 2D, mas é muito rudimentar e requer muito estudo para simplificar o que você realmente precisa de um mecanismo 2D.
Kokodoko