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.
using UnityEngine;
[ExecuteInEditMode]
public class ScaleWidthCamera : MonoBehaviour {
public int targetWidth = 640;
public float pixelsToUnits = 100;
void Update() {
int height = Mathf.RoundToInt(targetWidth / (float)Screen.width * Screen.height);
camera.orthographicSize = height / pixelsToUnits / 2;
}
}
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
- 5: 4
- 4: 3
- 3: 2
- 16:10
- 16: 9
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.
Vector3 leftBottom = camera.ViewportToWorldPoint(new Vector3(0, 0, camera.nearClipPlane));
Vector3 rightTop = camera.ViewportToWorldPoint(new Vector3(1, 1, camera.nearClipPlane));
float left = leftBottom.x;
float bottom = leftBottom.y;
float right = rightTop.x;
float top = rightTop.y;
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 :)