web-dev-qa-db-fra.com

Unity3D nouvelle interface utilisateur système et vues de liste

J'essaie de créer une vue liste avec la nouvelle interface utilisateur Unity (2014). La liste verticale et la liste déroulante doivent contenir des boutons d’image, qui doivent conserver leurs proportions en fonction de l’image qui leur est attribuée! Tous les boutons doivent s’étirer à la largeur de l’écran. Les boutons ne devraient pas avoir d’écart par rapport au suivant. (à peu près comme un UITableView dans iOS)

enter image description here

J'ai constaté que le groupe VerticalLayoutGroup fourni avec la nouvelle interface utilisateur ne m'aiderait pas, car il ne fonctionne pas correctement dans un ScrollRect. Je pense qu'il faudrait redimensionner en fonction des éléments contenus afin de le faire fonctionner avec ScrollRect.

Un autre problème est que je ne pouvais pas faire en sorte que les boutons conservent leur rapport largeur/hauteur, que j'ai résolu en écrivant un petit script (voir ci-dessous).

Pour obtenir l'effet de liste souhaité, j'ai créé un canevas avec un objet ScrollRect qui contient ensuite un RectTransform pour mon script ListLayout personnalisé. Les enfants de RectTransforms sont les boutons. 

La structure ressemble à ceci:

enter image description here

Chaque élément de la liste reçoit un script aspect de garde qui ressemble à ceci:

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 script ListLayout personnalisé, qui calcule sa hauteur en fonction des éléments qui le contiennent:

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) Existe-t-il un moyen de faire une vue en liste sans script (laid)? Il doit y avoir une meilleure façon?

2) Dans le script KeepAspect, j'aimerais beaucoup pouvoir accéder automatiquement au Sprite à partir de GameObject. Le fait est que le Sprite est contenu dans le script d'image du nouveau système d'interface utilisateur et il semble que je ne puisse pas accéder à celui-ci. MonoDevelop n'a pas pu le référencer Ou est-ce que je manque quelque chose?

13
Robse

Vous devez utiliser le nouvel espace de noms Unity UI pour accéder aux nouvelles classes, méthodes et propriétés de l'interface utilisateur.

Par exemple:


using UnityEngine;
using UnityEngine.UI; // New Unity UI system from Unity 4.6 version

namespace TestExample {
    public class TestNewUI : MonoBehaviour 
    {
        public Image image;

        public Slider slider;

        private Sprite _Sprite;

        void Start()
        {
            _Sprite = image.Sprite;
        }
    }
}

http://docs.unity3d.com/460/Documentation/ScriptReference/UI.Image.html

https://www.youtube.com/watch?v=TRLsmuYMs8Q


Je pense que cela vous aidera ;-)

6
Valera Kogut

TablePro est disponible pour Unity 5+ et le fait beaucoup plus maintenant si vous êtes intéressé par une solution préenregistrée: http://u3d.as/ipR

0
slumtrimpet