gpt4 book ai didi

c# - Unity3D 新的 UI 系统和 ListView

转载 作者:可可西里 更新时间:2023-11-01 08:11:29 25 4
gpt4 key购买 nike

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

enter image description here

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

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

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

结构如下:

enter image description here

列表中的每个项目都有一个 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));
}
}

我的自定义 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) 有没有一种方法可以在没有自定义(丑陋的)脚本的情况下进行 ListView ?必须有更好的方法吗?

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

最佳答案

您应该使用新的 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


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

关于c# - Unity3D 新的 UI 系统和 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25854631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com