从url加载并显示图像

我正在尝试将图像从url加载到GameObject。

我找到了下一个教程:

https://www.youtube.com/watch?v=8UK2EsKBzv8

下载成功,但我看不到图像。

我究竟做错了什么?

// Use this for initialization void Start () { StartCoroutine(loadSpriteImageFromUrl("https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/408px-Google_2015_logo.svg.png")); } IEnumerator loadSpriteImageFromUrl(string URL) { // Check internet connection if (Application.internetReachability == NetworkReachability.NotReachable) { yield return null; } var www = new WWW(URL); Debug.Log("Download image on progress"); yield return www; if (string.IsNullOrEmpty(www.text)) { Debug.Log("Download failed"); } else { Debug.Log("Download succes"); Texture2D texture = new Texture2D(1, 1); www.LoadImageIntoTexture(texture); Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.one / 2); GetComponent().sprite = sprite; // Change current sprite } } 

跑步前 跑完之后

编辑

按照ScriptRenderer的建议移动到UI Image后,代码如下所示:

 IEnumerator loadSpriteImageFromUrl(string URL, GameObject cell) { // Check internet connection if(Application.internetReachability == NetworkReachability.NotReachable) { yield return null; } var www = new WWW(URL); Debug.Log("Download image on progress"); yield return www; if(string.IsNullOrEmpty(www.text)) { Debug.Log("Download failed"); } else { Debug.Log("Download succes"); Texture2D texture = new Texture2D(1, 1); www.LoadImageIntoTexture(texture); Sprite sprite = Sprite.Create(texture, new Rect(0,0, texture.width, texture.height), Vector2.one/2); cell.AddComponent(); cell.GetComponent().sprite = sprite; } } 

但我得到下一个结果到屏幕(而不是url中的图像):

在此处输入图像描述

你的代码很好。 下载的图像未显示,因为您处于场景视图中且相机远离它。

在此处输入图像描述

选择脚本附加到的GameObject,然后按F键。 它应该放大它,你会看到下载的图像。 请参阅此处了解如何重置Unity布局以恢复游戏视图。

在此处输入图像描述



如果您仍然看不到图像,则SpriteRenderer不在相机前面。 从屏幕截图中,它的位置为0 ,因此请确保摄像机的位置为0-10

正确的显示图像方式:

要在Unity中简单地显示图像,请使用ImageRawImage组件。 建议使用RawImage ,因为它在更改纹理时不会产生垃圾。 你应该已经知道如何解决这个问题了

如果需要将Rigidbody或2D Colliders附加到该Image,则使用SpriteRendererMeshRenderer for 3D Objects来显示image

这是在Unity中显示图像的四种方法。 如果根本不需要物理或碰撞,建议使用#2

1.使用Image组件:

 public Image imageToDisplay; string url = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/408px-Google_2015_logo.svg.png"; void Start() { StartCoroutine(loadSpriteImageFromUrl(url)); } IEnumerator loadSpriteImageFromUrl(string URL) { WWW www = new WWW(URL); while (!www.isDone) { Debug.Log("Download image on progress" + www.progress); yield return null; } if (!string.IsNullOrEmpty(www.error)) { Debug.Log("Download failed"); } else { Debug.Log("Download succes"); Texture2D texture = new Texture2D(1, 1); www.LoadImageIntoTexture(texture); Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero); imageToDisplay.sprite = sprite; } } 

过去, LoadImageIntoTexture存在问题。 出于这个原因,我的其他示例将不使用LoadImageIntoTexture 。 如果你看到一个问号作为图像,那么使用带有Texture2D.LoadImage函数的www.bytes

简单地替换:

 Texture2D texture = new Texture2D(1, 1); www.LoadImageIntoTexture(texture); 

 Texture2D texture = new Texture2D(1, 1); texture.LoadImage(www.bytes); texture.Apply(); 

2.使用RawImage组件( 推荐 ):

 public RawImage imageToDisplay; string url = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/408px-Google_2015_logo.svg.png"; void Start() { StartCoroutine(loadSpriteImageFromUrl(url)); } IEnumerator loadSpriteImageFromUrl(string URL) { WWW www = new WWW(URL); while (!www.isDone) { Debug.Log("Download image on progress" + www.progress); yield return null; } if (!string.IsNullOrEmpty(www.error)) { Debug.Log("Download failed"); } else { Debug.Log("Download succes"); Texture2D texture = new Texture2D(1, 1); texture.LoadImage(www.bytes); texture.Apply(); imageToDisplay.texture = texture; } } 

3.使用SpriteRenderer组件:

主要用于使用Rigidbody2D2D Colliders进行2D对象和2D物理模拟。 如果没有,则使用上面的UI( #1#2 )。

 public SpriteRenderer imageToDisplay; string url = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/408px-Google_2015_logo.svg.png"; void Start() { StartCoroutine(loadSpriteImageFromUrl(url)); } IEnumerator loadSpriteImageFromUrl(string URL) { WWW www = new WWW(URL); while (!www.isDone) { Debug.Log("Download image on progress" + www.progress); yield return null; } if (!string.IsNullOrEmpty(www.error)) { Debug.Log("Download failed"); } else { Debug.Log("Download succes"); Texture2D texture = new Texture2D(1, 1); www.LoadImageIntoTexture(texture); Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero); imageToDisplay.sprite = sprite; } } 

4.使用MeshRenderer组件:

主要用于使用Rigidbody2D Colliders进行3D对象和3D物理模拟。 如果没有,则使用上面的UI( #1#2 )。 只需使用Plane,Quad或带有MeshRenderer的Cube。

 public MeshRenderer imageToDisplay; string url = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/408px-Google_2015_logo.svg.png"; void Start() { StartCoroutine(loadSpriteImageFromUrl(url)); } IEnumerator loadSpriteImageFromUrl(string URL) { WWW www = new WWW(URL); while (!www.isDone) { Debug.Log("Download image on progress" + www.progress); yield return null; } if (!string.IsNullOrEmpty(www.error)) { Debug.Log("Download failed"); } else { Debug.Log("Download succes"); Texture2D texture = new Texture2D(1, 1); www.LoadImageIntoTexture(texture); imageToDisplay.material.mainTexture = texture; } } 

新的Unity版本:

WWW API现在似乎已被弃用。 现在应该使用UnityWebRequest

 public Image imageToUpdate; void Start() { StartCoroutine(downloadImage()); } IEnumerator downloadImage() { string url = "http://wallpaper-gallery.net/images/hq-images-wallpapers/hq-images-wallpapers-12.jpg"; UnityWebRequest www = UnityWebRequest.Get(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 = new Texture2D(8, 8); Sprite sprite = null; if (texture2d.LoadImage(handle.data)) { sprite = Sprite.Create(texture2d, new Rect(0, 0, texture2d.width, texture2d.height), Vector2.zero); } if (sprite != null) { imageToUpdate.sprite = sprite; } } } 

您还可以使用UnityWebRequestTexture.GetTextureDownloadHandlerTexture.GetContent函数来更快地下载,处理和获取图像。

 IEnumerator downloadImage() { string url = "http://wallpaper-gallery.net/images/hq-images-wallpapers/hq-images-wallpapers-12.jpg"; 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, texture2d.width, texture2d.height), Vector2.zero); if (sprite != null) { imageToUpdate.sprite = sprite; } } }