it-swarm.com.de

Unity3D neues UI-System und Listenansichten

Ich versuche, eine Listenansicht mit der neuen Unity-Benutzeroberfläche (2014) zu erstellen. Die vertikale und scrollbare Liste sollte Bildschaltflächen enthalten, deren Seitenverhältnis basierend auf dem zugewiesenen Bild beibehalten werden sollte! Alle Tasten sollten sich bis zur Bildschirmbreite erstrecken. Die Knöpfe sollten keine Lücke zum nächsten haben. (Ähnlich wie eine UITableView in iOS)

enter image description here

Ich habe festgestellt, dass mir die VerticalLayoutGroup, die mit der neuen Benutzeroberfläche geliefert wird, nicht helfen würde, da sie nicht gut in ein ScrollRect eingebettet funktioniert. Ich denke, es müsste die Größe basierend auf den enthaltenen Elementen ändern, damit sie mit ScrollRect funktioniert.

Ein weiteres Problem ist, dass ich die Tasten nicht dazu bringen konnte, das Seitenverhältnis Breite zu Höhe beizubehalten, was ich durch das Schreiben eines kleinen Skripts (siehe unten) gelöst habe.

Um den gewünschten Listeneffekt tatsächlich zu erzielen, habe ich einen Canvas mit einem ScrollRect erstellt, der dann eine RectTransform für mein benutzerdefiniertes ListLayout-Skript enthält. Die untergeordneten Elemente von RectTransforms sind die Schaltflächen. 

Die Struktur sieht so aus:

enter image description here

Jedes Element in der Liste erhält ein Keep-Aspekt-Skript, das 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));
    }
}

Mein benutzerdefiniertes ListLayout-Skript, das seine Höhe in Abhängigkeit von den enthaltenen Elementen berechnet:

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, eine Listenansicht ohne benutzerdefinierte (hässliche) Scrips durchzuführen? Es muss einen besseren Weg geben?

2) Im KeepAspect-Skript würde ich gerne automatisch vom GameObject auf das Sprite zugreifen. Die Sache ist, das Sprite ist im Image Script des neuen UI-Systems enthalten und es scheint, dass ich nicht auf dieses zugreifen kann. MonoDevelop konnte es nicht referenzieren? Oder fehlt mir etwas?

13
Robse

Sie sollten den neuen Unity-UI-Namespace verwenden, um auf neue UI-Klassen, Methoden und Eigenschaften zugreifen zu können.

Als Beispiel:


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


Ich denke, das wird dir helfen ;-)

6
Valera Kogut

TablePro ist für Unity 5+ verfügbar und bietet jetzt und sofort mehr, wenn Sie an einer Dosenlösung interessiert sind: http://u3d.as/ipR

0
slumtrimpet