从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中简单地显示图像,请使用Image
或RawImage
组件。 建议使用RawImage
,因为它在更改纹理时不会产生垃圾。 你应该已经知道如何解决这个问题了
如果需要将Rigidbody或2D Colliders附加到该Image,则使用SpriteRenderer
或MeshRenderer
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
组件:
主要用于使用Rigidbody2D和2D 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
组件:
主要用于使用Rigidbody和2D 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.GetTexture
和DownloadHandlerTexture.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; } } }