Jump to content
Unity Insider Forum

Ui dynamisch mit Prefab


Recommended Posts

Hallo

 

Ich versuche mal mein Problem zu schildern: Ich habe einen Inventarbildschirm und auf dem sollen die Items angezeigt werden. Die Anzahl der Slots, die auf dem Bildschirm gezeigt werden, soll dynamisch von der Größe des entsprechenden Inventars abhängen. Ich habe also einen Slot zu einem Prefab gemacht, das ganze Canvas, auf dem die Slots zu sehen waren geleert und versuche das ganze nun dynamisch zu füllen. Dabei gehe ich wie folgt vor:

for (var i = 0; i < _inventory.MaxCapacity; ++i)
{
    var button = Instantiate(_slotButtonPrefab, _slotButtonCanvas.transform, true);
    _buttons.Add(button.GetComponent<Button>());
    _slotImages.Add(GameObject.Find("ItemIcon").GetComponent<Image>());
    _slotAmounts.Add(GameObject.Find("Amount").GetComponent<TextMeshProUGUI>());
}

 

Ein Slot besteht immer aus einem Button mit zwei Childs. Einem Image und einem kleinen Textfeld für die Anzahl. Alle Listen werden gefüllt.

Nun muss ich die entsprechenden Slots füllen und zwar mache ich das so:

 

 

public void UpdateInventoryScreen()
{
    for (var i = 0; i < _buttons.Count; ++i)
    {
        _buttons[i].image.color = Color.white;
    }
    for (var i = 0; i < _slotImages.Count; ++i)
    {
        _slotImages[i].sprite = null;
        _slotImages[i].color = new Color(0,0,0,0);
    }
    foreach (var slotAmount in _slotAmounts)
    {
        slotAmount.text = 6.ToString();
    }
    for (var i = 0; i < _inventory.Items.Count; ++i)
    {
        _slotImages[i].sprite = _inventory.Items[i].Icon;
        _slotImages[i].color = Color.white;
        _slotAmounts[i].text = _inventory.Items[i].Amount.ToString();
    }
}

 

Alle Änderungen scheinen aber nur Auswirkungen auf den ersten ItemButto zu haben. Es werden alle angezeigt, aber die Veränderungen immer nur im ersten.

Weiß jemand, was da los ist? Braucht es noch mehr Erklärungen?

 

Und was ich vergessen habe: Wenn ich das entsprechende Prefab im Editor öffne, sieht es komplett anders und unvollständig aus. Ich habe es nur in den Ordner gezogen...

 

Christoph

Link zu diesem Kommentar
Auf anderen Seiten teilen

_slotImages.Add(GameObject.Find("ItemIcon").GetComponent<Image>());
_slotAmounts.Add(GameObject.Find("Amount").GetComponent<TextMeshProUGUI>());

Hab mir nicht alles im Detail angeschaut, aber hier durchsuchst du alle GOs nach dieser Komponente (und damit findet er vermutlich immer nur den 1. Button), was falsch ist, du willst ja nur das aktuelle GO durchsuchen. Hier gibt es diese  Methode die ich verwenden würde:

 GameObject button = Instantiate(_slotButtonPrefab, _slotButtonCanvas.transform, true) as GameObject;
 _buttons.Add(button.GetComponent<Button>());
 _slotImages.Add(button.GetComponentInChildren<Image>());
 _slotAmounts.Add(button.GetComponentInChildren<TextMeshProUGUI>());



 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo 

 

Ich hatte das so auch probiert, aber es funktionierte ebenso nicht richtig. Habe mir jetzt eine Funktion gebastelt, mit der ich nach definierten Komponenten suchen kann. Damit funktioniert es jetzt. Ich versuche das nachher oder morgen hier noch dranzuhangen 

 

Christoph 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo

 

Damit habe ich die entsprechenden Sachen gefunden:

public static T GetChildComponentByName<T>(GameObject objectToSearch, string componentName) where T : Component
{
    foreach (T component in objectToSearch.GetComponentsInChildren<T>(true))
    {
        if (component.gameObject.name == componentName)
            return component;
    }
    return null;
}

 

Christoph

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...