Unity3D neue UI-System-und Listenansichten

Ich versuche, erstellen Sie eine Liste anzuzeigen mit dem neuen Unity UI (2014). Die vertikale und die scrollbare Liste sollte enthalten Bild-Tasten, die sollte behalten Ihr Seitenverhältnis, basierend auf Ihren zugewiesenen Bild! All-Schaltfläche sollte die Strecke, die der Breite des Bildschirms. Die Tasten sollten nicht, eine Lücke zum nächsten. (ziemlich viel wie ein UITableView in iOS)

Unity3D neue UI-System-und Listenansichten

Fand ich, dass die VerticalLayoutGroup, die kommt mit dem neuen UI wäre mir nicht helfen, da es nicht gut funktioniert, eingebettet in eine ScrollRect. Ich denke, es würde müssen, um die Größe auf der Grundlage der die Elemente enthalten, um es zu bekommen arbeiten mit der ScrollRect.

Ein weiteres problem ist, dass ich nicht die Tasten behalten Ihre Breite, Höhe, Seitenverhältnis, die ich gelöst, indem er ein kleines Skript (siehe unten).

Tatsächlich erreichen die gewünschte Liste-Effekt, habe ich eine Leinwand mit einem ScrollRect-die enthält dann ein RectTransform für meine eigene ListLayout Skript. Die Kinder der RectTransforms sind die Tasten.

Die Struktur sieht wie folgt aus:

Unity3D neue UI-System-und Listenansichten

Jedes Element in der Liste wird ein Aspekt script, welches wie folgt aussieht:

public class KeepAspect : MonoBehaviour {

    public Sprite sprite;
    public float aspect = 1;

    void Start() {
        if (sprite != null) {
            aspect = sprite.bounds.size.x / sprite.bounds.size.y;
        }
    }

    void Update() {
        RectTransform rectTransform = GetComponent<RectTransform>();
        Rect rect = rectTransform.rect;
        rectTransform.sizeDelta = new Vector2(rect.width, rect.width * (1f / aspect));
    }
}

Meine custom ListLayout Skript, das berechnet, deren Höhe abhängig von der die Elemente enthalten:

public class ListLayout : MonoBehaviour {

    public enum Direction { Vertical, Horizontal }

    public Direction direction = Direction.Vertical;
    public float spacing = 0;


    void Start() {
    }

    RectTransform[] GetItems() {
        RectTransform rect = GetComponent<RectTransform>();
        RectTransform[] items = new RectTransform[rect.childCount];
        for (int i = 0; i < rect.childCount; i++) {
            items[i] = rect.GetChild(i).GetComponent<RectTransform>();
        }
        return items;
    }

    void Update() {

        RectTransform rectTransform = GetComponent<RectTransform>();
        RectTransform[] items = GetItems();

        //stick together
        if (direction == Direction.Vertical) {

            float y = 0;

            foreach (RectTransform item in items) {
                Rect rect = item.rect;
                item.anchoredPosition = new Vector2(0, -y);
                item.sizeDelta = new Vector2(rectTransform.rect.width, rect.height);
                y += rect.height + spacing;
            }

            //adjust height
            rectTransform.sizeDelta = new Vector2(rectTransform.sizeDelta.x, y);
        }

        //TODO: horizontal layout
    }
}

Ich habe zwei Fragen zu diesem Ansatz:

1) gibt es eine Möglichkeit zu tun, eine Liste anzuzeigen, ohne eigene (hässliche) Scripte? Es muss einen besseren Weg?

2) In der KeepAspect script ich würde gerne den Zugriff auf die sprite aus der GameObject automatisch. Die Sache ist, das Sprite enthalten ist, in der Bild-Skript von der neuen UI-System, und es scheint, ich kann nicht diese zugreifen können. MonoDevelop konnte es nicht referenzieren? Oder bin ich etwas fehlt?

InformationsquelleAutor Robse | 2014-09-15

Schreibe einen Kommentar