web-dev-qa-db-ja.com

Unity3Dの新しいUIシステムとリストビュー

新しいUnityUI(2014)を使用してリストビューを作成しようとしています。垂直でスクロール可能なリストには、割り当てられた画像に基づいてアスペクト比を保持する画像ボタンが含まれている必要があります。すべてのボタンは画面の幅まで伸びる必要があります。ボタンに次のボタンとのギャップがあってはなりません。 (iOSのUITableViewとほとんど同じです)

enter image description here

新しいUIに付属しているVerticalLayoutGroupは、ScrollRectにうまく埋め込まれていないため、役に立たないことがわかりました。 ScrollRectで機能させるには、含まれているアイテムに基づいてサイズを変更する必要があると思います。

もう1つの問題は、ボタンの幅と高さのアスペクト比を維持できないことです。これは、小さなスクリプトを作成することで解決しました(以下を参照)。

実際に目的のリスト効果を実現するために、ScrollRectを使用してCanvasを作成しました。これには、カスタムListLayoutスクリプトのRectTransformが含まれています。 RectTransformsの子はボタンです。

構造は次のようになります。

enter image description here

リスト内のすべてのアイテムは、次のようなキープアスペクトスクリプトを取得します。

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

含まれているアイテムに応じて高さを計算するカスタムListLayoutスクリプト:

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

このアプローチには2つの質問があります。

1)カスタム(醜い)スクリプトなしでリストビューを実行する方法はありますか?より良い方法が必要ですか?

2)KeepAspectスクリプトで、GameObjectからスプライトに自動的にアクセスしたいと思います。問題は、スプライトが新しいUIシステムのイメージスクリプトに含まれていて、これにアクセスできないようです。 MonoDevelopはそれを参照できませんでしたか?それとも私は何かが足りないのですか?

13
Gering

新しいUIクラス、メソッド、およびプロパティにアクセスするには、新しいUnityUI名前空間を使用する必要があります。

例として:


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


私はこれがあなたを助けると思います;-)

6
Valera Kogut

TableProはUnity5 +で利用可能であり、缶詰のソリューションに興味がある場合は、これに加えて、すぐに使用できるようになりました: http://u3d.as/ipR

0
slumtrimpet