webentwicklung-frage-antwort-db.com.de

So ändern Sie die RectTransform-Eigenschaften im Skript [Unity 4.6 beta]

enter image description here

Hallo, ich verwende das neue UI-System aus der Unity 4.6-Beta ...

Ich habe verschiedene Codes ausprobiert, die Dokumente angesehen und herumgesucht, aber keine Antwort gefunden…

Zum Beispiel. Ich habe ein Bild und möchte während der Laufzeit Breite und Höhe ändern.

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

was nicht funktioniert Und image4.GetComponent (). Rect.y ist nur GET und kann daher nicht zur Laufzeit geändert werden.

Ich habe auch versucht:

image4.transform.localScale.y = 15;

was auch nicht funktioniert.

was ist der richtige Weg, um die Größe zur Laufzeit zu ändern? Sie können mir entweder in JS oder C # ein Beispiel geben, spielt keine Rolle.

14
Anh Bảy

Eines Tages recherchierte ... Ich fand eine Erweiterung, die uns beim Umgang mit dem neuen UI-System helfen kann. Sie kann diese Erweiterung verbessern, wenn Sie möchten.

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

Den Quellcode habe ich hier gefunden: http://orbcreation.com

32
Anh Bảy

Hey Friend, versuchen Sie es einfach, um die Position und Breite eines gameObject der Benutzeroberfläche zu ändern

wenn Sie die Instanz eines Objekts verwenden möchten verwenden Sie diesen leftButton.GetComponent<RectTransform>().anchoredPosition = new Vector2(-125, -36f); rightButton.GetComponent<RectTransform>().sizeDelta = new Vector2(x, y);

Wenn Sie ein Skript in ein UI-Objekt einfügen möchten, ändern Sie die Höhe und Breite

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

Beim Wechseln eines Elternteils (z. B. nach Instantiate) werden die Dinge unordentlich. Ich fand das Zurücksetzen einiger Parameter wirklich hilfreich (verbrachte viel Zeit damit, das herauszufinden):

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

Hoffe das hilft jemand anderem :)

3
Daniel

Das Spielen mit Folgendem kann helfen: GetComponent.sizeDelta = new Vector (new_size.x, new_size.y);

Ich habe die Einstellung der neuen GUI durch Einstellen dieser Eigenschaft erfolgreich erreicht.

Hier ist mein eigener Code zum Skalieren:

    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

versuchen Sie so etwas in C # zu verwenden:

 ...

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

    // set new width and height

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

    ...
1
Masterio

Normalerweise möchten Sie diese Werte nicht direkt ändern, auch wenn sie aus einem Prefab stammen, das Sie bereits mit den richtigen Koordinaten eingerichtet haben, wenn Sie sie nur unter Canvas (oder anderem) korrekt hinzufügen möchten, dies aber "Position ändern" tun diese:

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

Durch das Übergeben von false am übergeordneten Element wird vermieden, dass die Rect-Transformation in seltsamen Formen geändert wird, wenn das Prefab instanziiert wird.

0
tyoc213