Jump to content
Unity Insider Forum

Problem mit ScrollView, Instantiated Content und UnityWebRequest


Elharter

Recommended Posts

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:

image.thumb.png.20406839b5423f2bf649004d85ae51f0.png

 

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

image.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;
                }
            }
            
            
        }
    }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

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

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

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

Lädt...
×
×
  • Neu erstellen...