Ma méthode est généralement similaire aux solutions proposées par d'autres :). Je vais essayer d'expliquer en détail l'approche que je prends pour rendre le jeu indépendant de la taille de l'écran.
Orientation de l'écran
Selon l'orientation de l'écran (Paysage ou Portrait), vous devez déterminer si la caméra sera mise à l'échelle avec une hauteur ou une largeur fixes. La plupart du temps, je choisis une largeur fixe pour les jeux orientés paysage et une hauteur fixe pour les jeux orientés portrait.
Mise à l'échelle de la caméra
Comme discuté, cela peut être soit à hauteur fixe, soit à largeur fixe.
Hauteur fixe : La zone verticale du jeu sera toujours adaptée à la hauteur de l'écran. Et à mesure que le rapport d'aspect de l'écran change, de l'espace supplémentaire est ajouté à gauche et à droite de l'écran. Pour implémenter cela, vous n'avez besoin de rien coder, c'est le comportement par défaut de la caméra unit.
Largeur fixe : La zone horizontale du jeu correspondra toujours à la largeur de l'écran. Et un espace supplémentaire sera ajouté en haut et en bas au fur et à mesure que le rapport de format de l'écran change. Pour implémenter cela, vous devez écrire un petit morceau de code. Par la suite, assurez-vous de supprimer la fonction de mise à jour du formulaire de code et de l’activer.
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;
}
}
Dans l'éditeur, vous pouvez modifier targetWidth pour définir la zone d'espace mondial à afficher. Ce code est expliqué dans la vidéo suivante avec de nombreuses autres pratiques pour les jeux en 2D :)
Unite 2014 - Meilleures pratiques 2D dans Unity
Ratio d'aspect
Le format d'image suivant, classé du plus large au plus étroit, couvre presque toutes les tailles d'écran pour Android et iOS.
- 5: 4
- 4: 3
- 3: 2
- 16h10
- 16: 9
Je règle généralement tous ces proportions dans l'ordre indiqué dans la fenêtre du jeu, car c'est pratique lorsque vous testez différentes tailles d'écran :)
Zone Expendable
C'est la zone qui est ajoutée à l'écran sur les côtés ou en haut / en bas en fonction de la mise à l'échelle de la caméra que vous avez choisie.
Pour une hauteur fixe, tous les éléments du jeu doivent de préférence tenir dans un rapport 16: 9 qui est le plus étroit. Et le fond devrait s'étendre jusqu'à couvrir le rapport 5: 4. Ce qui garantit que votre jeu ne comporte jamais de bandes noires sur les côtés.
Pour une largeur fixe, c'est à peu près la même chose, mais ici, les éléments doivent tenir dans un rapport 5: 4 et le GT doit s'étendre jusqu'à 16: 9.
Bornes
Parfois, nous ne pouvons pas utiliser l’approche des zones consomptibles car nous devons utiliser l’ensemble de l’écran disponible pour le jeu.
Par exemple, considérons un jeu de portrait à hauteur fixe, capturant les pièces tombant du ciel. En cela, nous devons donner au joueur la possibilité de se déplacer horizontalement sur la largeur d'écran disponible.
Par conséquent, nous avons besoin des limites de la caméra en termes de coordonnées du monde pour savoir exactement où la gauche, la droite, le haut ou le bas de la caméra se positionne à la position du monde.
Nous pouvons également utiliser ces limites pour ancrer des éléments de jeu ou une interface utilisateur sur un côté souhaité de la caméra.
En utilisant Camera.ViewportToWorldPoint, nous pouvons obtenir les limites. L'espace Viewport est normalisé et relatif à la caméra. Le coin inférieur gauche de la caméra est (0,0); le coin supérieur droit est (1,1). La position z est en unités mondiales de la caméra. Pour 2D / orthographique, le z importe peu.
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
Pour l'interface utilisateur, nous pouvons appliquer les mêmes concepts que ceux que nous avons utilisés pour les éléments du jeu. Après l'introduction de l'interface utilisateur de Unity5 et la disponibilité de plugins tels que NGUI, le problème ne se posera plus :)