Unity3D 新 UI 系统和列表视图

Posted

技术标签:

【中文标题】Unity3D 新 UI 系统和列表视图【英文标题】:Unity3D new UI System and List Views 【发布时间】:2014-09-15 18:37:20 【问题描述】:

我正在尝试使用新的 Unity UI (2014) 构建列表视图。垂直和可滚动列表应包含图像按钮,它们应根据分配的图像保留其纵横比!所有按钮都应拉伸到屏幕宽度。这些按钮不应该与下一个有间隙。 (很像 ios 中的 UITableView)

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

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

为了真正实现所需的列表效果,我创建了一个带有 ScrollRect 的 Canvas,然后它包含一个用于我的自定义 ListLayout 脚本的 RectTransform。 RectTransforms 的孩子是按钮。

结构如下:

列表中的每个项目都有一个保持方面脚本,如下所示:

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
    

我对这种方法有两个问题:

1) 有没有一种方法可以在没有自定义(丑陋)脚本的情况下进行列表视图?一定有更好的方法吗?

2) 在 KeepAspect 脚本中,我希望自动从 GameObject 访问精灵。问题是,Sprite 包含在新 UI 系统的图像脚本中,似乎我无法访问这个。 MonoDevelop 不能引用它?还是我错过了什么?

【问题讨论】:

【参考方案1】:

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

举个例子:


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


我认为这会对你有所帮助;-)

【讨论】:

【参考方案2】:

TablePro 可用于 Unity 5+,如果您对罐装解决方案感兴趣,它现在可以提供更多功能:http://u3d.as/ipR

【讨论】:

以上是关于Unity3D 新 UI 系统和列表视图的主要内容,如果未能解决你的问题,请参考以下文章

从视图表中获取数据时出现 Laravel 错误

如何在相对布局中添加固定标题和滚动视图表行?

laravel5.2如何创建视图表

滚动列表视图垂直和水平相同的图像

SQL 如何查询指定架构中所有表(或视图)的名称

无法将查询另存为视图表