Я пытаюсь создать представление списка с новым Unity UI (2014). Вертикальный и прокручиваемый список должен содержать кнопки изображений, которые должны сохранять их соотношение сторон на основе назначенного ими изображения! Все кнопки должны растягиваться до ширины экрана. Кнопки не должны иметь пробела к следующему. (В значительной степени, как у UITableView в прошивке)Unity3D новый пользовательский интерфейс и список просмотров
Я обнаружил, что VerticalLayoutGroup, который поставляется с новым пользовательским интерфейсом, не помог бы мне, так как она не работает хорошо встраивается в ScrollRect. Я думаю, что для его работы с ScrollRect потребуется изменить размер на основе содержащихся элементов.
Другая проблема заключается в том, что я не мог заставить кнопки удерживать их ширину в отношении высоты, которую я решил, написав небольшой скрипт (см. Ниже).
Чтобы на самом деле выполнить желаемый эффект списка, я создал холст с помощью ScrollRect, который затем содержит RectTransform для моего собственного скрипта ListLayout. Дети 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 содержится в графическом редакторе новой системы пользовательского интерфейса, и, похоже, я не могу получить доступ к этому. MonoDevelop не мог ссылаться на него? Или я чего-то не хватает?