Eu recebi muitas respostas para essa pergunta, mas todas são genéricas e geralmente não são muito úteis. Nenhum dos tutoriais fala sobre relação de aspecto e como lidar com dispositivos móveis, e há um zilhão de maneiras de fazer isso, todas parecem ter problemas e falhas.
Eu realmente adoraria saber quais jogos de sucesso usaram para lidar com diferentes proporções no iOS e Android sem gerar um zilhão de ativos de tamanhos diferentes.
Estou falando estritamente de dispositivos móveis, não de desktop, especificamente com o Unity e não me importo com a interface do usuário, apenas com a tela de jogabilidade.
Os problemas que tenho em mente é quando há coisas importantes que precisam estar em determinados lugares e que não podem cair da tela. O uso de barras pretas na parte superior ou inferior é inaceitável atualmente.
fonte
Respostas:
O que você deseja é restringir a viewport da câmera em retrato ou paisagem (dependendo de suas necessidades), através da
camera.orthographicSize
propriedade de computação , para que você possa construir sua cena em 2d independentemente da proporção e resolução:Se você precisar de mais informações sobre isso, pergunte e eu responderei. ;) Saudações e aplausos.
ATUALIZAÇÃO: Use o script de ancoragem de objetos de Eliot Lash junto com este para colocar objetos em posições-chave na tela, se necessário (em relação aos cantos / bordas da tela). Se você fizer isso, renomeie "CameraFit" para "ViewportHandler".
Visualização simulando várias telas de proporção:
fonte
GetComponent<Camera>().orthographicSize = UnitSize / 2f;
para potrait / definição de unidades de alturaNormalmente, você não precisa de tamanhos diferentes de recursos - texturas e sprites importados com mapas mip gerados automaticamente ficarão agradáveis quando renderizados em qualquer tamanho menor ou igual ao tamanho de pixel original da imagem.
O layout da cena é o desafio. Uma boa abordagem é a seguinte (e, para sua informação, eu uso uma câmera 3D olhando para o conteúdo 2D posicionado em z = 0):
Em forma de código:
fonte
Se você usar as barras, é realmente muito simples de implementar (eu estou postando isso, embora o OP tenha declarado a opinião inaceitável porque tem o benefício de não ser tão ruim no celular e é uma solução simples que não requer nenhum código)
Camera.orthographicSize
é uma variável na câmera orto (usada pela maioria dos jogos 2D) que se ajusta à quantidade medida de unidades de jogo verticalmente na tela ( dividida por 2 ) ( fonte ). Portanto, escolha uma proporção que se encaixe na grande maioria dos dispositivos (eu escolhi 16: 9, pois a maioria das telas que pesquisei são 16: 9, 16:10, 3: 2) e adicione uma máscara que se sobreponha a essa proporção.Exemplo :
No meu jogo (não listado aqui, pois este não é um anúncio, pode perguntar nos comentários, se desejar), usamos o modo retrato. Para fazer um bom 16: 9 simples, criei minha câmera Ortho no tamanho 16. Isso significa que a câmera adaptará 32 unidades de altura de jogo (de 16 a 16 no meu caso) na vertical da tela do dispositivo.
Coloquei máscaras pretas com um jogo entre -9 e +9. Bem, a tela do jogo parece exatamente igual em todos os dispositivos e um pouco mais fina em dispositivos um pouco mais largos. Não tive absolutamente nenhum feedback negativo sobre as máscaras. Para fazer a paisagem, basta inverter esses valores e, então, você criaria a câmera com o tamanho 9. Altere os valores para corresponderem ao que você decidiu que é a escala da sua unidade de jogo.
O único lugar em que observamos a barra preta aparecer significativamente é no iPad, às 3: 2. Mesmo assim, não tive queixas.
fonte
Estou fazendo isso em um jogo no qual estou trabalhando atualmente. Eu tenho uma imagem de plano de fundo que é 1140x720. Os bits mais importantes (os que nunca devem ser cortados) estão contidos na área central de 960x640. Eu executo esse código na função start da minha câmera:
Também defino outros tamanhos, além do tamanho da fonte, para botões e afins. Funciona bem em todas as proporções que testei. Já faz um tempo desde que eu o configurei, então posso estar perdendo um passo. Deixe-me saber se não funcionar como esperado e vou ver se deixei alguma coisa de fora.
fonte
A resposta e o código de @ Marcel são ótimos e me ajudaram a entender o que estava acontecendo. É a resposta definitiva. Apenas pensei que alguém também poderia achar útil o que acabei fazendo no meu caso específico: como eu queria que algo realmente realmente simples, um sprite estivesse sempre na tela, eu vim com estas poucas linhas:
Adicionei isso à câmera e arrastei meu sprite (é meu plano de fundo) para a única propriedade do script. Se você não deseja barras pretas (horizontais ou verticais), pode colocar um fundo maior por trás dessa ...
fonte
Existem algumas maneiras de resolver esse problema, e não há uma solução perfeita (pelo menos ainda não encontrei uma) e o tipo de solução que você utiliza depende muito do tipo de jogo que você está usando. em desenvolvimento.
Independentemente de você o que faz, você deve começar escolhendo a menor resolução possível que deseja apoiar e criar seus sprites para essa resolução. Portanto, se você estiver interessado em desenvolver para iOS, de acordo com http://www.iosres.com/, a resolução mais baixa do dispositivo iOS é 480x320.
A partir daí, você pode começar a expandir os sprites para atender às resoluções mais altas. A ressalva é que você acabará percebendo que os sprites começam a ficar mais borrados na escala, nesse caso, você pode mudar para outro conjunto de sprites criados para resoluções mais altas.
Ou você pode ignorar o dimensionamento completamente e apenas decidir exibir mais da tela do jogo para obter resoluções mais altas (acredito que é assim que Terraria faz isso, por exemplo). No entanto, para muitos jogos, isso não é apropriado; jogos competitivos, por exemplo.
É isso? Muitos jogos que desejam forçar as proporções 4: 3 fazem isso. Como você está usando o Unity, você pode usar o script AspectRatioEnforcer para ajudar nisso.
fonte
Existem várias maneiras de lidar com esse problema, isso depende do seu jogo e do que funcionará melhor. Por exemplo, em nosso jogo Tyrant Unleashed , simplesmente fizemos mapas amplos com detalhes sem importância nas laterais, para que não há problema em cortar as laterais em dispositivos mais estreitos. No entanto, outros jogos podem ser melhores com uma abordagem em que você realmente muda os botões ou algo para se ajustar melhor à tela.
(também parte de nossa abordagem também é manter uma altura consistente em todos os dispositivos, variando apenas a largura. Isso certamente facilita a vida para nós, mas, novamente, isso pode ou não ser bom para o seu jogo específico. Não importa em nosso estilo artístico, se as imagens forem dimensionadas um pouco em telas diferentes, embora isso possa interessar algo como pixel art (basicamente, essa é a abordagem "deixe a Unity lidar com isso")
fonte
Estou usando o script a seguir, que adiciona um
targetAspect
parâmetro à câmera e o adaptaorthographicSize
em relação à proporção da tela (mais detalhes nesta postagem do blog ):fonte
Meu método é mais parecido com as soluções fornecidas por outros :) Vou tentar explicar em detalhes a abordagem adotada para tornar o jogo independente do tamanho da tela.
Orientação da tela
Dependendo da orientação da tela (paisagem ou retrato), é necessário considerar se a câmera será dimensionada com uma altura ou largura fixa. Escolho principalmente a largura fixa para jogos orientados para paisagem e altura fixa para jogos orientados para retrato.
Escala da câmera
Conforme discutido, isso pode ser altura ou largura fixas.
Altura fixa : a área vertical do jogo sempre se ajustará à altura da tela. E conforme a proporção da tela muda, haverá espaço extra adicionado à esquerda e direita da tela. Para implementar isso, você não precisa codificar nada, é o comportamento padrão da câmera da unidade.
Largura fixa : a área horizontal do jogo sempre se ajusta à largura da tela. E um espaço extra será adicionado à parte superior e inferior conforme a proporção da tela muda. Para implementar isso, você precisa escrever um pequeno pedaço de código. Posteriormente, remova a função de atualização do formulário de código e coloque-a em funcionamento.
No editor, você pode alterar a targetWidth para definir a área do espaço mundial que você deseja exibir. Este código é explicado no vídeo a seguir, juntamente com muitas outras práticas para jogos 2D :)
Unite 2014 - Melhores práticas 2D no Unity
Proporção da tela
As proporções a seguir, listadas da maior para a mais estreita, cobrem quase todos os tamanhos de tela para Android e iOS
Normalmente, defino todas essas proporções na ordem especificada abaixo da janela do jogo, pois é útil ao testar diferentes tamanhos de tela :)
Área de consumo
Essa é a área que é adicionada à tela nas laterais ou na parte superior / inferior, dependendo da escala da câmera que você escolheu.
Para altura fixa, todos os elementos do jogo devem se encaixar preferencialmente na proporção 16: 9, que é a mais estreita. E o plano de fundo deve se estender até cobrir a proporção de 5: 4. O que garante que seu jogo nunca tenha faixas pretas nas laterais.
Para largura fixa, é quase a mesma, mas aqui os elementos devem caber na proporção 5: 4 e o BG deve se estender até 16: 9.
Limites
Às vezes, não podemos usar a abordagem de área dispensável, pois precisamos utilizar toda a tela disponível para o jogo.
Por exemplo, considere um jogo de retratos com altura fixa, pegando as moedas que caem do céu. Nisso, precisamos dar ao jogador a capacidade de se mover horizontalmente sobre a largura da tela disponível.
Portanto, precisamos dos limites da câmera em termos de coordenadas mundiais para saber exatamente onde estão os lados esquerdo, direito, superior ou inferior dos clipes da câmera na posição mundial.
Também podemos usar esses limites para ancorar elementos do jogo ou interface do usuário para o lado desejado da câmera.
Usando Camera.ViewportToWorldPoint, podemos obter os limites. O espaço da viewport é normalizado e relativo à câmera. O canto inferior esquerdo da câmera é (0,0); o canto superior direito é (1,1). A posição z está nas unidades mundiais da câmera. Para 2D / ortográfico, o z não importa.
UI
Para a interface do usuário, podemos aplicar os mesmos conceitos que usamos para os elementos do jogo. Após a introdução da interface do usuário do Unity5 e a disponibilidade de plug-ins como o NGUI, isso não será um grande problema :)
fonte
Criei o Unity Asset 'Resolution Magic 2D' para resolver esse problema (anúncio: você pode obtê-lo na Unity Asset Store ou veja mais detalhes em grogansoft.com).
A maneira como lidei com o problema foi a seguinte ...
Defina uma área da tela que sempre deve estar visível, independentemente da proporção / resolução, e use uma simples transformação de retângulo para 'estêncil' esta região. Este é o seu formato de tela ideal. Usando um algoritmo simples, amplio a câmera até que a região bloqueada pelo retângulo seja a maior possível, mantendo-se 100% visível para a câmera.
Então sua área principal de jogo está sempre ocupando o máximo de tela possível. E desde que haja conteúdo 'extra' suficiente (por exemplo, seu plano de fundo) fora da área do retângulo que você definiu anteriormente, jogadores cuja tela não tenha a mesma proporção que o seu retângulo 'ideal' verá o conteúdo extra onde as barras pretas estariam ir.
Meu ativo também inclui alguma lógica para colocar a interface do usuário, mas isso é obsoleto devido ao novo sistema de interface do usuário do Unity.
Meu ativo fornece isso pronto para o uso com uma configuração mínima e funciona muito bem em todas as plataformas.
Se você usar essa técnica (ou o meu patrimônio), apenas projete seu jogo para ter espaço 'opcional' ao redor para acomodar telas maiores ou mais altas que o ideal (para evitar barras pretas).
Eu pessoalmente não faço jogos em 3D, então não sei se isso funcionaria em 3D (ou se é mesmo necessário).
É realmente difícil de explicar sem fotos, então visite meu site ( Resolution Magic 2D )
fonte
A melhor solução para mim é usar o teorema das linhas que se cruzam para que não haja um corte nas laterais nem uma distorção na visão do jogo. Isso significa que você precisa recuar ou avançar dependendo da proporção da imagem.
fonte
Criei uma extensão AssetStore que permite uma troca de aspecto mais fácil chamada AspectSwitcher . Ele fornece um sistema para permitir que você especifique facilmente diferentes propriedades para diferentes aspectos. Geralmente, existem dois métodos que a maioria das pessoas usa para alternar aspectos. Uma é fornecer objetos de jogo diferentes para cada aspecto. A outra é criar um código personalizado que modifique as propriedades de um único objeto de jogo com base no aspecto atual. Isso geralmente requer muita codificação personalizada. Minha extensão tenta aliviar muita dor.
fonte