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