Elharter Geschrieben 8. April 2020 Melden Share Geschrieben 8. April 2020 Hallo liebes Forum, ich habe folgendes Problem: Eine Scrollview. Darin enthalten sind natürlich etliche Listenitems. Ich habe mir ein Muster gebaut, dieses als Prefab gespeichert um es dann jeweils laden zu können. Die einzelnen Items (Prefabs) die ich dann innerhalb der ScrollView lade, lade ich per JSON aus einer MySQL DB aus dem Web. Funktioniert alles prima und wunderbar. Problem das ich nun habe: Ich möchte zu jedem einzelnen EIntrag eine Grafik laden, der per URL an Unity übertragen wird um in jedem Listeneintrag die dazupassende Grafik anzeigen zu können. Sämtlicher Inhalt kommt per JSON aus einer DB. Zur Veranschaulichung ein Screenshot: Nun. Die Bilder sollten links sein.... sowie dieses eine das man sehen kann. Zurzeit lade ich die Bilder per CoRoutine: IEnumerator GetTrackScreenshot(string filename, Transform avatar) { ..... Das Problem ist aber dass ich zwar das Transform des einzelnen Listenelements mitgeben kann - aber bei einem einfachen Reload der gesamten Liste, werden alle Grafiken vertauscht und stehen an falschen Stellen. Deswegen 2 Fragen: a) muss ich die Grafiken asynchron , per CoRoutine, laden? b) wie übergebe ich eine frisch instanziertes Listenelement SO an die CORoutine dass diese auch 100%ig weiß welches listenelemt betroffen ist? Ich habe jetzt alle Varianten durchprobiert und komme nicht auf den Fehler. Entweder verschieben sich alle Grafiken, oder es werden gar keine angezeigt. lg Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Elharter Geschrieben 8. April 2020 Autor Melden Share Geschrieben 8. April 2020 Rein informativ noch, damit man ein wenig Code sieht: Listenelemente werden so instanziert: GameObject track_sync_ListContentPanel = Instantiate(Track_SyncTrackListPrefab, SyncTrackListContent.transform); track_sync_ListContentPanel.transform.SetParent(SyncTrackListContent.transform); Füllen des Bildes links am Rand erfolgt zurzeit so: //fill track image in Transform TrackAvatar = track_sync_ListContentPanel.transform.Find("TrackImage Column/Avatar").transform; StartCoroutine(GetTrackScreenshot(data.filename.ToString().ToLower(), TrackAvatar)); Die CoRoutine GetTrackScreenshot sieht wie folgt aus: IEnumerator GetTrackScreenshot(string filename, Transform avatar) { string extractedfilename = filename.Replace(".trk", "_screenshot.png"); string path = "http://www.gene-racing.com/tracks/" + extractedfilename; UnityWebRequest www = UnityWebRequestTexture.GetTexture(path); yield return www.SendWebRequest(); yield return new WaitForSeconds(1); if (www.isNetworkError || www.isHttpError) { Debug.Log("WWW Error:"); Debug.Log(www.error); } else { Debug.Log("NO www error:"); //set new textures GameObject[] syncItems = GameObject.FindGameObjectsWithTag("Tracks_SyncTrackListItem"); foreach (GameObject prefab in syncItems) { Transform TrackFileName = prefab.transform.Find("TrackName").transform; Debug.Log("Trackname of SyncTrackListItem is:" + TrackFileName.GetComponent<Text>().text); if(TrackFileName.GetComponent<Text>().text.ToString().ToLower() == filename) { //find the parent avatar of it Transform avatarfound = TrackFileName.parent.Find("TrackImage Column/Avatar").transform; //Reset textures first, to avoid see old pictures Destroy(avatarfound.GetComponent<RawImage>().material.mainTexture); Destroy(avatarfound.GetComponent<RawImage>().texture); avatarfound.GetComponent<RawImage>().material.mainTexture = ((DownloadHandlerTexture)www.downloadHandler).texture; avatarfound.GetComponent<RawImage>().texture = ((DownloadHandlerTexture)www.downloadHandler).texture; } } } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.