Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity3D新UI系统和列表视图_C#_Listview_User Interface_Unity3d_Monodevelop - Fatal编程技术网

C# Unity3D新UI系统和列表视图

C# Unity3D新UI系统和列表视图,c#,listview,user-interface,unity3d,monodevelop,C#,Listview,User Interface,Unity3d,Monodevelop,我正在尝试使用新的Unity UI(2014)构建列表视图。垂直和可滚动列表应包含图像按钮,这些按钮应根据其指定的图像保留其纵横比!所有按钮应延伸至屏幕宽度。按钮与下一个按钮之间不应有间隙。(非常像iOS中的UITableView) 我发现新UI附带的VerticalLayoutGroup对我没有帮助,因为它不能很好地嵌入到ScrollRect中。我认为它需要根据包含的项目调整大小,以便使用ScrollRect 另一个问题是我无法让按钮保持其宽高比,我通过编写一个小脚本(见下文)解决了这个问题

我正在尝试使用新的Unity UI(2014)构建列表视图。垂直和可滚动列表应包含图像按钮,这些按钮应根据其指定的图像保留其纵横比!所有按钮应延伸至屏幕宽度。按钮与下一个按钮之间不应有间隙。(非常像iOS中的UITableView)

我发现新UI附带的VerticalLayoutGroup对我没有帮助,因为它不能很好地嵌入到ScrollRect中。我认为它需要根据包含的项目调整大小,以便使用ScrollRect

另一个问题是我无法让按钮保持其宽高比,我通过编写一个小脚本(见下文)解决了这个问题

为了实际实现所需的列表效果,我创建了一个带有ScrollRect的画布,其中包含一个用于自定义ListLayout脚本的RectTransform。矩形变换的子对象是按钮

结构如下所示:

列表中的每个项都会获得一个keep aspect脚本,该脚本如下所示:

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));
    }
}
公共类KeepAspect:单行为{
公共雪碧;
公共浮动方面=1;
void Start(){
如果(精灵!=null){
aspect=sprite.bounds.size.x/sprite.bounds.size.y;
}
}
无效更新(){
RectTransform RectTransform=GetComponent();
Rect Rect=rectcransform.Rect;
rectcransform.sizeDelta=新矢量2(rect.width,rect.width*(1f/纵横比));
}
}
我的自定义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
    }
}
公共类列表布局:单行为{
公共枚举方向{垂直,水平}
公共方向=垂直方向;
公共浮点数间距=0;
void Start(){
}
RectTransform[]GetItems(){
RectTransform rect=GetComponent();
RectTransform[]items=新的RectTransform[rect.childCount];
for(int i=0;i
对于这种方法,我有两个问题:

1) 有没有一种方法可以在没有自定义(难看的)纸条的情况下创建列表视图?一定有更好的办法吗


2) 在KeepAspect脚本中,我希望自动从游戏对象访问精灵。问题是,精灵包含在新UI系统的图像脚本中,我似乎无法访问这个。你不能参考它吗?还是我遗漏了什么?

您应该使用新的Unity UI名称空间来访问新的UI类、方法和属性

例如:





我想这会对你有帮助;-)

TablePro适用于Unity 5+,如果您对罐装解决方案感兴趣,现在还可以提供更多:

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