Problèmes de résolution lors du portage d'un jeu Unity sur Android

9

Donc, je porte un jeu sur Android pour la première fois dans Unity3D. Et j'ai rencontré quelques problèmes en cours de route. Mon problème actuel est que la résolution ne semble pas être correcte, elle coupe les bords de l'écran et mes arrêts de défilement pour faire défiler l'écran gauche / droite ne sont plus au bon endroit.

Après avoir fait un peu de recherche, beaucoup de gens disent que vous devez rendre votre résolution de jeu indépendante pour pouvoir fonctionner sur tous les Androids / Iphone / Ipad. Est-ce vrai? Si oui, comment dois-je procéder? Si ce n'est pas le cas, comment puis-je aider à corriger la résolution afin que lorsque je porte sur des appareils mobiles, cela semble correct?

EDIT: Je n'ai toujours pas vraiment ce dont j'ai besoin, les résolutions ne fonctionnent toujours pas correctement, même avec le code et les astuces énumérés ci-dessous. J'ai besoin d'un moyen pour que la résolution s'ajuste en fonction de l'appareil. Pour une raison quelconque, lorsque j'essaie de récupérer la résolution d'un appareil à l'aide du code de Mungoid, il renvoie 0x0

Timothy Williams
la source
1
Vous devrez parcourir tout morceau de code qui suppose une certaine résolution d'écran et la modifier afin qu'elle puisse prendre la résolution d'écran actuelle et faire quelque chose avec. Selon ce que vous faites et comment, il n'y a pas de solution unique.
Tetrad
En ce qui concerne les détails, cette question va dans le détail (il y a beaucoup de questions à ce sujet sur le site) gamedev.stackexchange.com/questions/51/…
Tetrad
Ahh, donc en gros ce que Namar a dit: "Assurez-vous de tout placer avec des ratios. Par exemple, une barre de santé serait placée à 80% de la largeur de l'écran avec 10% de la largeur de l'écran pour son échelle horizontale" alors comment pourrais-je corriger le référencement des zones spécifiques dans l'espace? Mon défilement d'écran est basé sur des zones spécifiques de l'espace mondial, mais cela semble être perturbé par les changements de résolution.
Timothy Williams
Pourriez-vous être plus précis sur votre problème? Vous dites que la résolution "ne semble pas être correcte" et qu'elle est "toujours désactivée" - mais la résolution d'écran est généralement une propriété fixe de l'appareil. Ce n'est donc pas la résolution qui est fausse, mais la façon dont vous effectuez le rendu à l'écran. Si vous faites des hypothèses sur la largeur et la hauteur de l'écran, vous aurez toujours des problèmes sur différents appareils et rapports d'aspect.
Kylotan
Je suppose que ce que j'essaie de faire, c'est d'écrire un code pour trouver la résolution la plus basse, de régler le jeu sur cela et de mettre à l'échelle tous les objets en conséquence. Je sais comment régler l'échelle du terrain de jeu, mais je n'arrive pas à obtenir la résolution de l'appareil. donc le jeu est "trop ​​zoomé", ou tout est trop gros.
Timothy Williams

Réponses:

7

Un problème que vous rencontrerez avec Android est que chaque appareil différent a sa propre taille d'écran, sa résolution et sa densité de pixels. Si vous voulez que votre jeu soit identique sur tous les appareils, vous avez beaucoup de travail et ne serez probablement jamais satisfait des résultats. Le jeu apparaîtra étiré sur les écrans larges ou compressé sur les écrans autres que les écrans larges. Je vous suggère de décider de ce qui est vraiment important et de laisser glisser quelque chose d'autre.

Sans captures d'écran ni connaissance de votre jeu et de son apparence, nous pouvons tous spéculer sur des solutions, mais nous n'avons pas de direction spécifique pour vous donner des conseils spécifiques.

Dans Unity, vous pouvez accéder aux dimensions de l'écran actuel avec la classe Screen : Screen.widthet Screen.height(entre autres propriétés). Vous pouvez ensuite changer la caméra rapport hauteur / largeur de pour modifier ce qui est visible sur vos écrans de différentes tailles en fonction des dimensions de l'écran et de vos attentes personnelles concernant ce qui devrait être visible.

Si vous devez vous assurer que les écrans HUD sont correctement mis à l'échelle, vous pouvez le faire en modifiant la matrice de transformation GUI en OnGUI()fonction des dimensions de l'écran dans chaque fonction. Je l'ai déjà fait en créant ce script simple et en l'attachant à tout ce qui rendait les éléments de l'interface graphique que je voulais mettre à l'échelle:

//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;
}

Ensuite, dans la ou les OnGUI()fonctions réelles , je mets tout de suite la matrice de transformation:

function OnGUI()
{
    GUI.matrix = guiScale.GetGUIMatrix();
    /* Everything Else */
}
chaosTechnicien
la source
Le réglage du rapport d'aspect de la caméra en fonction de la largeur et de la hauteur de l'écran n'aide pas, lorsque le téléphone est vertical, il ne s'affiche pas du tout et lorsque le téléphone est horizontal, il affiche exactement la même chose qu'auparavant. Le jeu est divisé en trois sections, vous faites défiler les sections en douceur avec votre doigt (comme dans Angry Birds), voici une image de ce à quoi le côté gauche est censé ressembler. Et le milieu . Voici le côté gauche lorsque mon téléphone est tenu verticalement ,
Timothy Williams
Et voici horizontalement . J'espère que ces images peuvent aider, c'est la première fois que je porte de Unity vers Android, ou même que je crée un jeu Android. Je suis un peu perdue.
Timothy Williams
A en juger par (mon interprétation de) vos explications et vos photos, le problème n'est pas la résolution; votre appareil photo n'est pas dans un endroit qui peut éventuellement afficher tout ce que vous voulez sur un petit écran. Réduisez vos niveaux ou reculez votre appareil photo pour afficher plus ou quelque chose. Je suggère de définir votre fenêtre de jeu à une taille beaucoup plus petite pour représenter la taille d'un appareil réel au lieu de la taille 1230x530ish que vous avez maintenant afin que vous puissiez avoir une idée de ce que vous verrez lorsque vous le poussez.
chaosTechnician
Le problème est que j'ai déjà effectué un zoom arrière assez important sur l'appareil photo. Si ce problème persiste, comment puis-je prendre en compte avec précision les différents écrans et tailles et les modifier?
Timothy Williams,
@ TimothyWilliams, vous pourriez probablement trouver quelque chose en choisissant une résolution minimale (800x600 ou quelque chose) avec laquelle votre jeu fonctionne. Ensuite, utilisez Screen.widthet .heighten tandem avec Camera.fieldOfViewet Camera.aspectpour reproduire la même vue sur des tailles d'écran arbitraires. Il suffirait juste de quelques trig pour déterminer spécifiquement comment le faire.
chaosTechnician
0

vous pouvez essayer quelque chose comme ce qui suit et l'appliquer. Je suppose qu'un appareil mobile ne devrait renvoyer qu'une seule résolution.

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);
};

Jetez également un œil ici pour plus d'informations sur l'écran dans l'unité http://unity3d.com/support/documentation/ScriptReference/Screen.html

Mungoid
la source
Cela ne m'a pas aidé, la résolution est toujours désactivée.
Timothy Williams
Il renvoie "0x0" sur mon Android pour une raison quelconque
Timothy Williams