Jump to content
Unity Insider Forum
Sign in to follow this  
chrische5

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

Share this post


Link to post
Share on other sites
_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>());



 

Share this post


Link to post
Share on other sites

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 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...