web-dev-qa-db-fra.com

Comment accéder aux positions gauche, droite, haut et bas de RectTransform via un code?

J'ai un canevas d'interface utilisateur avec le mode espace de rendu défini. Pour tous les éléments d'interface utilisateur appartenant à ce canevas, les variables "gauche", "droite", "haut" et "bas" apparaissent dans le composant RectTransform de l'éditeur. Des moyens d'accéder à ces variables via le code? 

17
Sanath Bharadwaj

Ceux seraient

RectTransform rectTransform;

/*Left*/ rectTransform.offsetMin.x;
/*Right*/ rectTransform.offsetMax.x;
/*Top*/ rectTransform.offsetMax.y;
/*Bottom*/ rectTransform.offsetMin.y;
34
maksymiuk

Les deux réponses ci-dessus sont un peu sur la bonne voie, j'ai retardé mon projet pour cette raison, mais je l'ai découvert en programmant au lit. OffsetMin et offsetMax sont ce dont vous avez besoin, mais ils ne font pas tout, vous devez inclure les ancres de la transformation rect:

public RectTransform recTrans;

// Use this for initialization
void Start () {
    Vector2 min = recTrans.anchorMin;
    min.x *= Screen.width;
    min.y *= Screen.height;

    min += recTrans.offsetMin;

    Vector2 max = recTrans.anchorMax;
    max.x *= Screen.width;
    max.y *= Screen.height;

    max += recTrans.offsetMax;

    Debug.Log(min + " " + max);
}

Si vous branchez ceci dans une classe fictive, cela devrait vous donner les lectures correctes, quels que soient les ancres que vous utilisez.

La façon dont cela fonctionne devrait être évident, mais une petite explication ne ferait pas de mal.

Les décalages font référence à la différence de position entre min et max à partir du point central de la transformation rect. L'ajout de ces valeurs aux bornes de l'ancre donne les transformations rectes correctes, min et max. Bien que les ancres min et max soient normalisées, vous devrez les réduire en les multipliant par la taille de l'écran.

2
dkoitka
RectTransform rt = GetComponent<RectTransform>();
float left   =  rt.offsetMin.x;
float right  = -rt.offsetMax.x;
float top    = -rt.offsetMax.y;
float bottom =  rt.offsetMin.y;

TL; DR

D'après les valeurs affichées dans l'inspecteur, mon analyse est que Left, Right, Top et Bottom sont positifs si les bornes correspondantes sont dans le rectangle formé par les ancres de RectTransform.

offsetMin.x en tant que Left et offsetMin.y en tant que Bottom remplissent toujours cette évaluation, mais offsetMax.x en tant que Right et offsetMax.y en tant que Top ne le fait pas.

J'ai simplement pris les valeurs opposées de offsetMax pour le rendre conforme (modification d'espace de base).

2
Numid

Vous pouvez également définir plus facilement toutes les valeurs sur deux lignes. Il suffit d’obtenir offsetMin, qui est Vector2, et de définir deux paramètres (le premier est à gauche et le second est en bas). Ensuite, faites de même avec offsetMax (le premier est à droite et le second est en haut). N'oubliez pas que offsetMax est inversé. Par conséquent, si vous souhaitez définir Right = 20, vous devez définir la valeur -20 dans le script.

Le code ci-dessous définit les valeurs: 

Gauche = 10, 

Bas = 20, 

Droite = 30, 

Top = 40

GameObject.GetComponent<RectTransform> ().offsetMin = new Vector2 (10,20);
GameObject.GetComponent<RectTransform> ().offsetMax = new Vector2 (-30,-40);

J'espère que ça va aider quelqu'un d'autre;)

0
Skylin R