web-dev-qa-db-fra.com

Unity 4.3 - comprendre les positions et la résolution d'écran, comment définir correctement la position de l'objet?

En utilisant Unity 4.3 en mode 2D, j'ai un GameObject qui est un Sprite (dans le SpriteRenderer j'ai réglé le Sprite), et j'essaie de le positionner en haut à gauche de l'écran.

J'aimerais que ce Sprite soit positionné en haut à gauche (par exemple) dans chaque résolution (j'ai iOS comme cible de construction donc dans mon cas je parle d'iPhone toutes les résolutions, rétine, non-rétine, iPad etc.) .

Ce qui me manque, c'est comment fonctionne exactement le système de coordonnées, j'ai l'habitude de travailler avec des pixels dans un système de coordonnées où 0,0 commence en bas à gauche ou en haut à gauche.

Ici, dans Unity 4.3, le 0,0 semble être au centre (ce n'est évidemment pas un gros problème) mais ce qui me rend confus, c'est que si j'imprime la largeur de mon objet (qui est de 128 pixels), j'obtiens un 1,06 comme valeur , et aussi l'écran est subdivisé en "points" je suppose, donc la gauche est -3 et la droite est +3

alors les questions sont les suivantes: pourquoi ma largeur de sprite est de 1,06? Comment je suis censé positionner parfaitement les choses dans ce système?

Imaginez que je souhaite positionner un carré de 128px * 128px exactement en haut à gauche, comment faire?

21
Adarkuccio

La première chose que vous voudrez peut-être noter est que lorsque vous importez une image en tant que Texture Type = Sprite, il y a un attribut "Pixels To Units", que vous verrez sur l'actif Sprite.

enter image description here

Ainsi, votre 128px, s'il est laissé aux paramètres par défaut, serait large de 1,28 "Unités". Cependant, cette valeur ne correspond pas à votre mesure de 1,06, donc je ne sais pas d'où cela vient. Cela peut être dû au fait que l'échelle de votre objet Sprite n'est pas uniforme, ou au fait que votre paramètre "Pixels en unités" a été modifié. Vérifiez dans l'inspecteur que votre texture d'entrée est en fait 128 x 128, et vérifiez également que la valeur Pixel en unités est ce que vous attendez d'elle.

Notez ensuite que la "taille" d'une caméra orthographique correspond à la moitié de sa hauteur.

Ainsi, dans l'image ci-dessous, la caméra ortho verra la zone dans la boîte blanche. Taille 5, signifie 10 unités de haut. L'image d'une fleur que j'ai dans la scène est une image de 128 pixels de large par 96 pixels de haut, importée aux paramètres par défaut (1 unité = 100 pixels).

enter image description here

Maintenant, je ne sais pas quel est votre cas d'utilisation exact (c'est-à-dire que c'est peut-être mieux résolu en utilisant une GUITexture). Cependant, en supposant que vous souhaitez utiliser un Sprite, et chaque image que vous souhaitez qu'il soit dans le coin supérieur gauche, et que vous souhaitez que ce Sprite soit toujours affiché en résolution native, le code suivant le fera. Ajoutez-le à un script attaché à l'objet de jeu Sprite.

// Update is called once per frame
void Update () {
    float camHalfHeight = Camera.main.orthographicSize;
    float camHalfWidth = Camera.main.aspect * camHalfHeight; 

    Bounds bounds = GetComponent<SpriteRenderer>().bounds;

    // Set a new vector to the top left of the scene 
    Vector3 topLeftPosition = new Vector3(-camHalfWidth, camHalfHeight, 0) + Camera.main.transform.position; 

    // Offset it by the size of the object 
    topLeftPosition += new Vector3(bounds.size.x / 2,-bounds.size.y / 2, 0);

    transform.position = topLeftPosition;        
}
37
ardrian