Unity3D nouveau Système d'UI et les Vues de Liste
Je suis en train de construire une liste grâce à la nouvelle Unité d'INTERFACE (2014). La verticale et défilement de la liste devrait contenir des images des boutons, qui doivent conserver leur aspect ratio fondé sur leur image affectée! Bouton tout devrait s'étirer à la largeur de l'écran. Les boutons ne devriez pas avoir un écart à la suivante. (un peu comme une UITableView dans iOS)
J'ai trouvé que le VerticalLayoutGroup qui vient avec la nouvelle INTERFACE ne m'aiderait pas, car il ne fonctionne pas bien intégrées dans un rectangle ScrollRect. Je pense qu'il aurait besoin de redimensionner basé sur le contenant des éléments dans l'ordre pour qu'il fonctionne avec le rectangle ScrollRect.
Un autre problème est que je ne pouvais pas obtenir les boutons pour maintenir leur largeur à la hauteur de l'aspect ratio, que j'ai résolu en écrivant un petit script (voir ci-dessous).
D'accomplir réellement la liste désirée effet, j'ai créé une Toile avec un rectangle ScrollRect qui contient alors un RectTransform pour mon custom ListLayout script. Les enfants de la RectTransforms sont les boutons.
La structure ressemble à ceci:
Chaque élément de la liste obtient un garder l'aspect script qui ressemble à:
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));
}
}
Mon custom ListLayout script, qui permet de calculer sa hauteur en fonction de l'contenant des éléments:
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
}
}
J'ai deux questions à cette approche:
1) Est-il un moyen de faire un affichage de liste sans personnalisé (moche) de scripts? Il y a une meilleure façon?
2) Dans le KeepAspect script j'aimerais accéder à la sprite de la GameObject automatiquement. La chose est, le Sprite est contenue dans l'Image à l'écriture de la nouvelle INTERFACE utilisateur du Système et il semble que je ne peux pas accéder à celui-ci. MonoDevelop ne pouvait pas référence? Ou ai-je raté quelque chose?
OriginalL'auteur Robse | 2014-09-15
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser la nouvelle Unité de l'INTERFACE utilisateur de l'espace de noms afin d'accéder à de nouvelles classes de l'INTERFACE utilisateur, des méthodes et des propriétés.
Comme un exemple:
http://docs.unity3d.com/460/Documentation/ScriptReference/UI.Image.html
https://www.youtube.com/watch?v=TRLsmuYMs8Q
Je pense que ce sera vous aider 😉
OriginalL'auteur Valera Kogut
TablePro est disponible pour l'Unité 5+ et ne présente plus beaucoup plus maintenant hors de la boîte si vous êtes intéressé dans une conserve solution: http://u3d.as/ipR
OriginalL'auteur slumtrimpet