web-dev-qa-db-fra.com

Comment modifier les propriétés de RectTransform dans un script [Unity 4.6 beta]

enter image description here

Bonjour, j'utilise le nouveau système d'interface utilisateur d'Unity 4.6 beta ...

J'ai essayé différents codes, jeté un coup d'œil à la documentation et cherché, mais je ne trouve pas la réponse…

Par exemple. J'ai une image et je souhaite modifier la largeur et la hauteur pendant l'exécution.

public GameObject image4;
image4.GetComponent<RectTransform>().rect.Set(0,0,100, 300);

qui ne fonctionne pas. Et image4.GetComponent (). Rect.y est GET seulement et ne peut donc pas être modifié au moment de l'exécution.

J'ai aussi essayé:

image4.transform.localScale.y = 15;

qui ne fonctionne pas non plus.

quelle est la bonne façon de changer la taille au moment de l'exécution? Vous pouvez me donner un exemple en JS ou en C #, peu importe.

14
Anh Bảy

Un jour, à la recherche de ……., J'ai trouvé une extension qui peut nous aider à gérer le nouveau système d'interface utilisateur …… .peut améliorer cette extension si vous le souhaitez.

public static class RectTransformExtensions
{
    public static void SetDefaultScale(this RectTransform trans) {
        trans.localScale = new Vector3(1, 1, 1);
    }
    public static void SetPivotAndAnchors(this RectTransform trans, Vector2 aVec) {
        trans.pivot = aVec;
        trans.anchorMin = aVec;
        trans.anchorMax = aVec;
    }

    public static Vector2 GetSize(this RectTransform trans) {
        return trans.rect.size;
    }
    public static float GetWidth(this RectTransform trans) {
        return trans.rect.width;
    }
    public static float GetHeight(this RectTransform trans) {
        return trans.rect.height;
    }

    public static void SetPositionOfPivot(this RectTransform trans, Vector2 newPos) {
        trans.localPosition = new Vector3(newPos.x, newPos.y, trans.localPosition.z);
    }

    public static void SetLeftBottomPosition(this RectTransform trans, Vector2 newPos) {
        trans.localPosition = new Vector3(newPos.x + (trans.pivot.x * trans.rect.width), newPos.y + (trans.pivot.y * trans.rect.height), trans.localPosition.z);
    }
    public static void SetLeftTopPosition(this RectTransform trans, Vector2 newPos) {
        trans.localPosition = new Vector3(newPos.x + (trans.pivot.x * trans.rect.width), newPos.y - ((1f - trans.pivot.y) * trans.rect.height), trans.localPosition.z);
    }
    public static void SetRightBottomPosition(this RectTransform trans, Vector2 newPos) {
        trans.localPosition = new Vector3(newPos.x - ((1f - trans.pivot.x) * trans.rect.width), newPos.y + (trans.pivot.y * trans.rect.height), trans.localPosition.z);
    }
    public static void SetRightTopPosition(this RectTransform trans, Vector2 newPos) {
        trans.localPosition = new Vector3(newPos.x - ((1f - trans.pivot.x) * trans.rect.width), newPos.y - ((1f - trans.pivot.y) * trans.rect.height), trans.localPosition.z);
    }

    public static void SetSize(this RectTransform trans, Vector2 newSize) {
        Vector2 oldSize = trans.rect.size;
        Vector2 deltaSize = newSize - oldSize;
        trans.offsetMin = trans.offsetMin - new Vector2(deltaSize.x * trans.pivot.x, deltaSize.y * trans.pivot.y);
        trans.offsetMax = trans.offsetMax + new Vector2(deltaSize.x * (1f - trans.pivot.x), deltaSize.y * (1f - trans.pivot.y));
    }
    public static void SetWidth(this RectTransform trans, float newSize) {
        SetSize(trans, new Vector2(newSize, trans.rect.size.y));
    }
    public static void SetHeight(this RectTransform trans, float newSize) {
        SetSize(trans, new Vector2(trans.rect.size.x, newSize));
    }
}

Le code source que j'ai trouvé à partir d'ici: http://orbcreation.com

32
Anh Bảy

Hey Friend, essayez ceci pour changer la position et la largeur d'une interface utilisateur gameObject

si vous voulez utiliser une instance d'objet utilisez This leftButton.GetComponent<RectTransform>().anchoredPosition = new Vector2(-125, -36f); rightButton.GetComponent<RectTransform>().sizeDelta = new Vector2(x, y);

Et si vous voulez mettre un script sur un objet d'interface utilisateur, essayez ceci pour changer la hauteur et la largeur

GetComponent<RectTransform>().anchoredPosition = new Vector2(-125, -36f);
GetComponent<RectTransform>().sizeDelta = new Vector2(x, y)
6
SogekingSenpai

Lorsque je change de parent (par exemple après Instantiate), les choses se compliquent, je trouve que réinitialiser quelques paramètres m'a vraiment aidé (j'ai passé un peu de temps à essayer de comprendre cela):

this.transform.SetParent(content.transform);
this.transform.localScale = Vector3.one;            
this.rectTransform.sizeDelta = Vector2.zero;
this.rectTransform.anchoredPosition = Vector2.zero;

J'espère que ça aide quelqu'un d'autre :)

3
Daniel

Jouer avec les éléments suivants peut aider: GetComponent.sizeDelta = new Vector (new_size.x, new_size.y);

J'ai réussi à agrandir la nouvelle interface graphique en définissant cette propriété.

Voici mon propre code pour la mise à l'échelle:

    void Start()
{
    // Store initial Size and Position;
    ZoomedOutSize = new Vector2(GetComponent<RectTransform>().rect.width, GetComponent<RectTransform>().rect.height);
    ZoomedOutPos = new Vector2(GetComponent<RectTransform>().localPosition.x, GetComponent<RectTransform>().localPosition.y);
}

void Update()
{
    // Calculate the total delta at runtime cause it depends on parent (yah i know it's not optimal to have new vector ecery Update)
    ZoomSizeRate = new Vector2(gameObject.GetComponentInParent<ZoomDialog>().MaxSize.x - ZoomedOutSize.x, gameObject.GetComponentInParent<ZoomDialog>().MaxSize.y - ZoomedOutSize.y);
    ZoomPosRate = -GetComponent<RectTransform>().localPosition;

    // Zoom is the float with range(0,1) 0 - no Zoom, 1 - Fully Zoom to ParentSize;
    //Set the size delta and position as Initial + Rate * Zoom
    GetComponent<RectTransform>().sizeDelta = new Vector2(ZoomedOutSize.x + ZoomSizeRate.x * Zoom, ZoomedOutSize.y + ZoomSizeRate.y * Zoom);
    GetComponent<RectTransform>().localPosition = new Vector2(ZoomedOutPos.x + ZoomPosRate.x * Zoom, ZoomedOutPos.y + ZoomPosRate.y * Zoom);
}
1
Lux Divina

essayez d'utiliser quelque chose comme ça [en C #]:

 ...

    RectTransform rTrans = (RectTransform) transform.GetComponent<RectTransform>();

    // set new width and height

    rTrans.anchoredPosition = new Vector2(15, 200);

    ...
1
Masterio

Normalement, vous ne voulez pas modifier directement ces valeurs, encore plus si elles proviennent d’un préfabriqué que vous avez déjà configuré avec les bons coordonnées, si vous voulez juste l’ajouter correctement sous canvas (ou autre), ce:

GameObject instance;

void Start () {
    GameObject canvas = GameObject.Find ("Canvas");
    if (canvas != null) {
        GameObject go = Resources.Load<GameObject>("MyPrefab");
        if(go != null){
            instance = Instantiate(go);
            instance.GetComponent<Transform>().SetParent(canvas.GetComponent<Transform>(), false);
        }
    }
}

Passer false sur le parent du set évitera que la transformation rect ne soit changée sous des formes étranges lors de l'instanciation du préfabriqué.

0
tyoc213