2017-11-17 2 views
0

Wie der Titel vermuten lässt, versuche ich ein UI-Panel mit einer GridLayoutGroup Komponente zur Laufzeit mit Sprites aus dem Resources-Ordner zu füllen. Das Problem besteht darin, dass sich die Sprites nicht automatisch an den Rasterzellen ausrichten, sondern in der Mitte des Bereichs gezeichnet werden.Dynamische Auffüllung variabler Sprites in der Grid-Layoutgruppe

Ich habe den Ansatz here versucht, aber es funktioniert nicht für mich. Hier ist das Skript, das ich an die gui angebracht habe mit dem GridLayoutGroup:

public class SpriteList : MonoBehaviour 
{ 
    public GameObject gridPanel; 
    public const string sortingLayer = "Foreground"; 

    // Use this for initialization 
    void Start() 
    { 
     Sprite[] spriteArray = Resources.LoadAll<Sprite>("Sprites"); 
     RectTransform gridRT = gridPanel.GetComponent<RectTransform>(); 

     for (int i = 0; i < spriteArray.Length; i++) 
     { 
      GameObject cellObject = new GameObject(); 
      cellObject.AddComponent<SpriteRenderer>(); 
      cellObject.GetComponent<SpriteRenderer>().sprite = spriteArray[i]; 
      cellObject.GetComponent<SpriteRenderer>().sortingLayerName = sortingLayer; 

      GameObject sprite = (GameObject) Instantiate(cellObject); 
      sprite.transform.SetParent(gridPanel.transform, false); 
      LayoutRebuilder.ForceRebuildLayoutImmediate( 
        gridPanel.GetComponent<RectTransform>()); 
      sprite.transform.localScale = new Vector3(30, 30, 1); 
    } 
} 

Ändern der Einstellungen des GridLayoutGroup nicht verändern das Verhalten, das ich überhaupt bin zu sehen.

Da alles ich online sehen scheint darauf hinzudeuten, dass der Schlüssel ist die Linie

sprite.transform.SetParent(gridPanel.transform, false); 

, die ich benutze, was bin ich dabei?

Vielen Dank!

Antwort

-1

Für Ihre Objekte sollte eine Komponente "Layoutelement" angehängt sein.

Nachdem Sie das übergeordnete Objekt festgelegt haben, rufen Sie LayoutRebuilder.ForceRebuildLayoutImmediate() auf dem übergeordneten Objekt auf.

+0

Ich habe das versucht und es hat nicht funktioniert (ich habe auch meinen Beitrag aktualisiert, um den neuen Code aufzunehmen). Weißt du, warum das so sein könnte? Vielen Dank! – Rookatu

0

Ich konnte dies lösen, indem ich eine rect-Transformation prefab mit einem SpriteRenderer angefügt, und dann Instantiierung von Kopien der Prefab und Zuweisung der gewünschten Sprite zur Laufzeit. Ich bin mir nicht sicher, warum meine alten Ansatz nicht funktioniert (ich glaube ich etwas sehr grundlegende bin fehlt), aber hier ist der Code ich jetzt benutze:

public GameObject gridPanel; 
public const string sortingLayer = "Foreground"; 
public GameObject prefab; 

// Use this for initialization 
void Start() 
{ 
    Sprite[] spriteArray = Resources.LoadAll<Sprite>("Sprites"); 
    GameObject newObj; 

    for (int i = 0; i < spriteArray.Length; i++) 
    { 
     newObj = (GameObject)Instantiate(prefab, transform); 
     newObj.GetComponent<SpriteRenderer>().sprite = spriteArray[i]; 
     newObj.GetComponent<SpriteRenderer>().sortingLayerName = sortingLayer; 
     LayoutRebuilder.ForceRebuildLayoutImmediate(gridPanel.transform as RectTransform); 
    } 
} 

Ich sollte erwähnen, dass dieser Ansatz/ungedeckten eingeführt ein neues Problem, dass die Größe und der Abstand der Sprites weit weg ist. Ich habe versucht, das jetzt für eine Weile zu beheben, ohne Erfolg; Ich werde weiterhin versuchen, meine Lösung hier zu posten, wenn ich sie festlege, oder eine andere Frage stellen und einen Link dazu hier posten.

Verwandte Themen