chrische5 Geschrieben 28. Juni 2020 Melden Share Geschrieben 28. Juni 2020 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 More sharing options...
Zer0Cool Geschrieben 28. Juni 2020 Melden Share Geschrieben 28. Juni 2020 _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 More sharing options...
chrische5 Geschrieben 29. Juni 2020 Autor Melden Share Geschrieben 29. Juni 2020 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 More sharing options...
chrische5 Geschrieben 29. Juni 2020 Autor Melden Share Geschrieben 29. Juni 2020 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 More sharing options...
Zer0Cool Geschrieben 29. Juni 2020 Melden Share Geschrieben 29. Juni 2020 Ja was ich vorgeschlagen hatte funktioniert nur für ein Child des gleichen Typs, bei mehreren ist dann deine Methode gut. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.