Unity3D nouveau Système d'UI et les Vues de Liste

Je suis en train de construire une liste grâce à la nouvelle Unité d'INTERFACE (2014). La verticale et défilement de la liste devrait contenir des images des boutons, qui doivent conserver leur aspect ratio fondé sur leur image affectée! Bouton tout devrait s'étirer à la largeur de l'écran. Les boutons ne devriez pas avoir un écart à la suivante. (un peu comme une UITableView dans iOS)

Unity3D nouveau Système d'UI et les Vues de Liste

J'ai trouvé que le VerticalLayoutGroup qui vient avec la nouvelle INTERFACE ne m'aiderait pas, car il ne fonctionne pas bien intégrées dans un rectangle ScrollRect. Je pense qu'il aurait besoin de redimensionner basé sur le contenant des éléments dans l'ordre pour qu'il fonctionne avec le rectangle ScrollRect.

Un autre problème est que je ne pouvais pas obtenir les boutons pour maintenir leur largeur à la hauteur de l'aspect ratio, que j'ai résolu en écrivant un petit script (voir ci-dessous).

D'accomplir réellement la liste désirée effet, j'ai créé une Toile avec un rectangle ScrollRect qui contient alors un RectTransform pour mon custom ListLayout script. Les enfants de la RectTransforms sont les boutons.

La structure ressemble à ceci:

Unity3D nouveau Système d'UI et les Vues de Liste

Chaque élément de la liste obtient un garder l'aspect script qui ressemble à:

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

Mon custom ListLayout script, qui permet de calculer sa hauteur en fonction de l'contenant des éléments:

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

J'ai deux questions à cette approche:

1) Est-il un moyen de faire un affichage de liste sans personnalisé (moche) de scripts? Il y a une meilleure façon?

2) Dans le KeepAspect script j'aimerais accéder à la sprite de la GameObject automatiquement. La chose est, le Sprite est contenue dans l'Image à l'écriture de la nouvelle INTERFACE utilisateur du Système et il semble que je ne peux pas accéder à celui-ci. MonoDevelop ne pouvait pas référence? Ou ai-je raté quelque chose?

OriginalL'auteur Robse | 2014-09-15