2014-09-15 2 views
13

Я пытаюсь создать представление списка с новым Unity UI (2014). Вертикальный и прокручиваемый список должен содержать кнопки изображений, которые должны сохранять их соотношение сторон на основе назначенного ими изображения! Все кнопки должны растягиваться до ширины экрана. Кнопки не должны иметь пробела к следующему. (В значительной степени, как у UITableView в прошивке)Unity3D новый пользовательский интерфейс и список просмотров

enter image description here

Я обнаружил, что VerticalLayoutGroup, который поставляется с новым пользовательским интерфейсом, не помог бы мне, так как она не работает хорошо встраивается в ScrollRect. Я думаю, что для его работы с ScrollRect потребуется изменить размер на основе содержащихся элементов.

Другая проблема заключается в том, что я не мог заставить кнопки удерживать их ширину в отношении высоты, которую я решил, написав небольшой скрипт (см. Ниже).

Чтобы на самом деле выполнить желаемый эффект списка, я создал холст с помощью ScrollRect, который затем содержит RectTransform для моего собственного скрипта ListLayout. Дети RectTransforms - это кнопки.

структура выглядит следующим образом:

enter image description here

Каждый элемент в списке получает сохранить пропорции скрипт, который выглядит следующим образом:

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 не мог ссылаться на него? Или я чего-то не хватает?

ответ

6

Чтобы получить доступ к новым классам, методам и свойствам пользовательского интерфейса, вы должны использовать новое пространство имен UIU.

В качестве примера:


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


Я думаю, что это поможет ;-)

0

TablePro доступен для Unity 5+ и делает это плюс намного больше, если вы заинтересованы в консервированном решении: http://u3d.as/ipR

Смежные вопросы