Resolução de problemas ao portar um jogo do Unity para Android

9

Então, estou portando um jogo para o Android pela primeira vez no Unity3D. E eu me deparei com alguns problemas ao longo do caminho. Meu problema atual é que a resolução não parece correta, corta as bordas da tela e minha rolagem para a rolagem da tela para a esquerda / direita não está mais no lugar certo.

Depois de fazer um pouco de pesquisa, muitas pessoas dizem que você precisa tornar seu jogo Resolution Independent para poder rodar em todos os Androids / Iphone / Ipad. Isso é verdade? Se sim, como faço para fazer isso? Caso contrário, como posso ajudar a corrigir a resolução para que, quando for portada para dispositivos móveis, pareça correta?

Edição: Eu ainda não tenho o que eu preciso, as resoluções ainda não estão funcionando corretamente, mesmo com o código e os truques listados abaixo. Preciso de alguma maneira para a resolução ser ajustada com base no dispositivo. Por alguma razão, quando tento recuperar a resolução de um dispositivo usando o código da Mungoid, ele retorna 0x0

Timothy Williams
fonte
11
Você precisará passar por qualquer parte do código que assume uma determinada resolução de tela e alterá-la para que ela possa obter a resolução de tela atual e fazer alguma coisa com ela. Dependendo do que você está fazendo e como, não há uma solução única para todos.
Tetrad #
Tanto quanto especificidades, esta questão entra em algum detalhe (há um monte de perguntas sobre este no site) gamedev.stackexchange.com/questions/51/...
Tétrada
Ahh, basicamente o que Namar disse: "Certifique-se de colocar tudo com proporções. Por exemplo, uma barra de saúde seria colocada em 80% da largura da tela e 10% da largura da tela para sua escala horizontal", então como eu poderia corrigir as referências áreas específicas no espaço? Minha rolagem de tela baseia-se em áreas específicas do espaço mundial, mas isso parece ter atrapalhado as alterações na resolução.
Timothy Williams
Você poderia ser mais específico sobre o seu problema? Você diz que a resolução "não parece correta" e "ainda está desativada" - mas a resolução da tela geralmente é uma propriedade fixa do dispositivo. Portanto, não é a resolução que está errada, mas a maneira como você renderiza na tela. Se você fizer suposições sobre a largura e a altura da tela, sempre terá problemas em diferentes dispositivos e proporções.
Kylotan
Acho que realmente o que estou tentando fazer é escrever um código para encontrar a menor resolução, definir o jogo para isso e dimensionar todos os objetos de acordo. Eu sei como definir a escala do campo de jogo, mas não consigo obter a resolução do dispositivo. portanto, o jogo é "muito ampliado" ou tudo é muito grande.
Timothy Williams

Respostas:

7

Um problema com o Android é que cada dispositivo diferente tem seu próprio tamanho de tela, resolução e densidade de pixels. Se você deseja que seu jogo pareça idêntico em todos os dispositivos, você trabalha muito e provavelmente nunca ficará satisfeito com os resultados. O jogo aparecerá esticado em telas widescreen ou compactado em telas não widescreen. Sugiro que você decida o que é realmente importante e deixe que qualquer outra coisa deslize um pouco.

Sem capturas de tela ou conhecimento sobre o que é o seu jogo e como ele é, todos podemos especular soluções, mas não temos instruções específicas para dar conselhos específicos.

No Unity, você pode acessar as dimensões da tela atual com a classe Screen : Screen.widthe Screen.height(entre outras propriedades). Você pode alterar a proporção da câmera para alterar o que é visível em suas telas de tamanhos diferentes com base nas dimensões da tela e na sua expectativa pessoal do que deve ser visível.

Se você precisar garantir que todas as telas do HUD sejam dimensionadas adequadamente, altere a matriz de transformação da GUI com base nas dimensões da tela em todas as OnGUI()funções. Eu já fiz isso antes, criando esse script simples e anexando-o a qualquer coisa que renderizasse os elementos da GUI que eu queria que fossem dimensionados:

//GUI values in code are assigned based on an 800x600 screen
private var nativeWidth : float = 800.0f;  
private var nativeHeight : float = 600.0f;
private var guiMatrix : Matrix4x4;

function Start () 
{
    var scale : Vector3 = Vector3(Screen.width / nativeWidth, 
                                  Screen.height / nativeHeight,
                                  1.0f);
    guiMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, scale);
}

function GetGUIMatrix() : Matrix4x4
{
    return guiMatrix;
}

Então, nas OnGUI()funções reais , defino a matriz de transformação imediatamente:

function OnGUI()
{
    GUI.matrix = guiScale.GetGUIMatrix();
    /* Everything Else */
}
caosTécnico
fonte
Definir a proporção da câmera com base na largura e altura da tela não ajuda, quando o telefone está na vertical, ele não aparece e, quando o telefone está na horizontal, mostra exatamente o mesmo de antes. O jogo é dividido em três seções, você rola suavemente entre as seções com o dedo (como em Angry Birds), aqui está uma imagem de como o lado esquerdo deve parecer. E o meio . Aqui está o lado esquerdo quando meu telefone é mantido na vertical ,
Timothy Williams
E aqui está horizontalmente . Espero que essas fotos possam ajudar, esta é minha primeira vez migrando do Unity para o Android ou até mesmo fazendo um jogo para Android. Estou um pouco perdido.
Timothy Williams
A julgar pela (minha interpretação) suas explicações e suas fotos, o problema não é a resolução; sua câmera não está em um local que possa mostrar tudo o que você deseja em uma tela pequena. Diminua seus níveis ou mova sua câmera de volta para mostrar mais ou algo assim. Sugiro que você defina a janela do jogo com um tamanho muito menor para representar o tamanho de um dispositivo real , em vez do tamanho de 1230 x 530 que você tem agora, para que você possa ter uma ideia do que verá ao pressioná-lo.
chaosTechnician
O problema é que eu já reduzi o zoom da câmera substancialmente. Se esse problema persistir, como posso contabilizar com precisão várias telas e tamanhos e modificar para isso?
Timothy Williams
@ TimothyWilliams, você provavelmente poderia resolver algo escolhendo uma resolução mínima (800x600 ou algo assim) com a qual seu jogo funciona. Em seguida, use Screen.widthe .heightem conjunto com Camera.fieldOfViewe Camera.aspectpara reproduzir a mesma exibição em tamanhos de tela arbitrários. Seria necessário apenas alguns trig para descobrir especificamente como fazê-lo.
chaosTechnician
0

você pode tentar algo como o seguinte e aplicá-lo. Eu acho que um dispositivo móvel deve retornar apenas uma resolução.

function Start()
{
    var resolutions : Resolution[] = Screen.resolutions;
    // Print the resolutions
    for (var res in resolutions) {
        print(res.width + "x" + res.height);
    }
    // Switch to the lowest supported fullscreen resolution
    Screen.SetResolution (resolutions[0].width, resolutions[0].height, true);
};

Também dê uma olhada aqui para obter mais informações sobre a Tela em unidade http://unity3d.com/support/documentation/ScriptReference/Screen.html

Mungoid
fonte
Isso não me ajudou, a resolução ainda está desligada.
Timothy Williams
Ele retorna "0x0" no meu Android por alguma razão ...
Timothy Williams