C# (unity)我想从URL下载应用程序每个按钮的图像,但它只显示最后一个按钮

C# (unity)我想从URL下载应用程序每个按钮的图像,但它只显示最后一个按钮,c#,unity3d,C#,Unity3d,所有按钮和文本都可以很好地显示,但图像仅显示最后一个按钮。当我尝试单击以检查user.value.imageUrl时,它是正确的。我不知道怎么了,请帮帮我。我想IEnumerator有我遗漏的东西 我的代码是: void CreateButton() { FirebaseRestClent.GetUsers(users => { foreach (var user in users) {

所有按钮和文本都可以很好地显示,但图像仅显示最后一个按钮。当我尝试单击以检查user.value.imageUrl时,它是正确的。我不知道怎么了,请帮帮我。我想IEnumerator有我遗漏的东西

我的代码是:

  void CreateButton()
    {
        FirebaseRestClent.GetUsers(users =>
        {
            foreach (var user in users)
            {
                StartCoroutine(downloadImage(user.Value.imageUrl));
                var clone = Instantiate(button,m_transform) as GameObject;
                var modelBtn = clone.GetComponent<Button>();

                imageToUpdate = modelBtn.GetComponent<Image>();
                title = modelBtn.GetComponentInChildren<Text>();
                title.text = user.Value.saveFile;

                //Debug.Log($"{user.Value.modelUrl} {user.Value.saveFile} {user.Value.imageUrl}");
                modelBtn.onClick.AddListener(delegate { 
                    Debug.Log(user.Value.modelUrl + user.Value.saveFile + user.Value.imageUrl);
                    dlManager.PlayModel(user.Value.modelUrl, user.Value.saveFile,user.Value.musicUrl,false);
                    //dlManager.PlayModel(user.Value.modelUrl, user.Value.saveFile, false);
                });

            }
        });
        
    }
    IEnumerator downloadImage(string url)
    {

        UnityWebRequest www = UnityWebRequestTexture.GetTexture(url);

        DownloadHandler handle = www.downloadHandler;

        //Send Request and wait
        yield return www.SendWebRequest();

        if (www.isHttpError || www.isNetworkError)
        {
            UnityEngine.Debug.Log("Error while Receiving: " + www.error);
        }
        else
        {
            UnityEngine.Debug.Log("Success");

            //Load Image
            Texture2D texture2d = DownloadHandlerTexture.GetContent(www);
            Sprite sprite = null;
            sprite = Sprite.Create(texture2d, new Rect(0, 0, 326, texture2d.height), Vector2.zero);
            imageToUpdate.sprite = sprite;

        }
    }

您总是覆盖循环中相同的imageToUpdate字段引用,因此很可能所有结果都会写入最后一个用户的图像组件中

您应该更简单地将图像引用传递给例程

void CreateButton()
{
    FirebaseRestClent.GetUsers(users =>
    {
        foreach (var user in users)
        {
            var clone = Instantiate(button, m_transform) as GameObject;
            var modelBtn = clone.GetComponent<Button>();

            var image = modelBtn.GetComponent<Image>();
            // instead of storing it in a class field rather 
            // pass the image reference into the Coroutine
            StartCoroutine(downloadImage(user.Value.imageUrl, image));

            title = modelBtn.GetComponentInChildren<Text>(true);
            title.text = user.Value.saveFile;

            modelBtn.onClick.AddListener(()=>
            { 
                Debug.Log(user.Value.modelUrl + user.Value.saveFile + user.Value.imageUrl);
                dlManager.PlayModel(user.Value.modelUrl, user.Value.saveFile, user.Value.musicUrl, false);
            });
        }
    });
}

IEnumerator downloadImage(string url, Image targetImage)
{
    using(www = UnityWebRequestTexture.GetTexture(url))
    {
        //Send Request and wait
        yield return www.SendWebRequest();

        if (www.isHttpError || www.isNetworkError)
        {
            Debug.Log("Error while Receiving: " + www.error);
        }
        else
        {
            Debug.Log("Success");

            //Load Image
            var texture2d = DownloadHandlerTexture.GetContent(www);
            var sprite = Sprite.Create(texture2d, new Rect(0, 0, 326, texture2d.height), Vector2.zero);
            targetImage.sprite = sprite;
        }
    }
}

很有效,谢谢。