从网址加载并显示图像

时间:2017-05-11 07:35:30

标签: c# image url unity3d

我正在尝试将图片从网址加载到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<SpriteRenderer>().sprite = sprite;    // Change current sprite
    }
}

Before Running After Running

修改

按照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<Image>();
        cell.GetComponent<Image>().sprite = sprite;    
    }
}

但是我的下一个结果是屏幕(而不是网址中的图片):

enter image description here

1 个答案:

答案 0 :(得分:2)

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

enter image description here

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

enter image description here

如果仍然无法看到图像,则SpriteRenderer不在相机前面。从屏幕截图中,其位置为000,因此请确保相机的位置为00,{{ 1}}。

显示图片的正确方法:

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

如果您需要将Rigidbody或2D Colliders附加到该图像,请使用RawImageSpriteRenderer 3D对象显示MeshRenderer

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

1 。使用image组件:

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功能www.bytes

简单地替换:

Texture2D.LoadImage

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

2 。使用Texture2D texture = new Texture2D(1, 1); texture.LoadImage(www.bytes); texture.Apply(); 组件(推荐):

RawImage

3 。使用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; } } 组件:

主要用于 Rigidbody2D 2D碰撞器的2D物体和2D物理模拟。如果没有,请使用上面的用户界面(#1 #2 )。

SpriteRenderer

4 。使用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; } } 组件:

主要用于使用 Rigidbody 2D Colliders 进行3D物体和3D物理模拟。如果没有,请使用上面的用户界面(#1 #2 )。只需使用一个平面,四边形或一个MeshRenderer的立方体。

MeshRenderer

新的Unity版本:

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; } } API现在似乎已被弃用。现在应该使用WWW

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