Ger*_*ing 13 c# user-interface listview monodevelop unity-game-engine
我正在尝试使用新的Unity UI(2014)构建列表视图.垂直和可滚动列表应包含图像按钮,这些按钮应根据其指定的图像保留其纵横比!所有按钮都应拉伸到屏幕宽度.按钮不应与下一个按钮有间隙.(非常像iOS中的UITableView)

我发现新UI附带的VerticalLayoutGroup对我没有帮助,因为它不能很好地嵌入ScrollRect中.我认为它需要根据包含的项目进行调整,以使其与ScrollRect一起使用.
另一个问题是我无法让按钮保持其宽高比,我通过编写一个小脚本解决了这个问题(见下文).
为了实际完成所需的列表效果,我创建了一个带有ScrollRect的Canvas,然后包含一个用于我的自定义ListLayout脚本的RectTransform.RectTransforms的子节点是按钮.
结构如下所示:

列表中的每个项都会获得一个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));
}
}
Run Code Online (Sandbox Code Playgroud)
我的自定义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
}
}
Run Code Online (Sandbox Code Playgroud)
我对这种方法有两个问题:
1)有没有一种方法可以在没有自定义(丑陋)潦草的情况下进行列表视图?一定有更好的方法?
2)在KeepAspect脚本中,我希望自动从GameObject访问sprite.事实是,Sprite包含在新UI系统的Image Script中,似乎我无法访问这个.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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
http://docs.unity3d.com/460/Documentation/ScriptReference/UI.Image.html
https://www.youtube.com/watch?v=TRLsmuYMs8Q
我认为这会对你有帮助;-)
| 归档时间: |
|
| 查看次数: |
16852 次 |
| 最近记录: |