How to load an image from URL with Unity?

浪子不回头ぞ 提交于 2019-11-28 01:13:59

问题


Please save me from going crazy.

No matter how many times I google, I always end up with (usually deprecated) versions of the following code:

IEnumerator setImage(string url) {
    Texture2D texture = profileImage.canvasRenderer.GetMaterial().mainTexture as Texture2D;

    WWW www = new WWW(url);
    yield return www;

    Debug.Log("Why on earh is this never called?");

    www.LoadImageIntoTexture(texture);
    www.Dispose();
    www = null;
}

I'm using Unity 5 not 4. The URL I'm trying to load exists. Please shine some light on me.

How do I load an image over HTTP and display it in a UnityEngine.UI.Image?


回答1:


quick clarification: https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html

public void yourMethod()
{
   StartCoroutine(setImage("http://url/image.jpg")); //balanced parens CAS
}

IEnumerator setImage(string url) {
    Texture2D texture = profileImage.canvasRenderer.GetMaterial().mainTexture as Texture2D;

    WWW www = new WWW(url);
    yield return www;

    // calling this function with StartCoroutine solves the problem
    Debug.Log("Why on earh is this never called?");

    www.LoadImageIntoTexture(texture);
    www.Dispose();
    www = null;
}



回答2:


For Unity 2018+ use UnityWebRequest which replaces the WWW class.

void Start(){    
    StartCoroutine(DownloadImage(url));
}

IEnumerator DownloadImage(string MediaUrl)
{   
    UnityWebRequest request = UnityWebRequestTexture.GetTexture(MediaUrl);
    yield return request.SendWebRequest();
    if(request.isNetworkError || request.isHttpError) 
        Debug.Log(request.error);
    else
        YourRawImage.texture = ((DownloadHandlerTexture) request.downloadHandler).texture
} 



回答3:


When you want to go async:

using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;

public static async Task<Texture2D> GetRemoteTexture ( string url )
{
    using( UnityWebRequest www = UnityWebRequestTexture.GetTexture( url ) )
    {
        //begin requenst:
        var asyncOp = www.SendWebRequest();

        //await until it's done: 
        while( asyncOp.isDone==false )
        {
            await Task.Delay( 1000/30 );//30 hertz
        }

        //read results:
        if( www.isNetworkError || www.isHttpError )
        {
            //log error:
            #if DEBUG
            Debug.Log( $"{ www.error }, URL:{ www.url }" );
            #endif

            //nothing to return on error:
            return null;
        }
        else
        {
            //return valid results:
            return DownloadHandlerTexture.GetContent( www );
        }
    }
}

Usage example:

[SerializeField] string _imageUrl;
[SerializeField] Material _material;

async void Start ()
{
    Texture2D texture = await GetRemoteTexture( _imageUrl );
    _material.mainTexture = texture;
}



回答4:


Thanks to the question asked by Umair M, I figured out that this method needs to be called using unity's StartCoroutine.




回答5:


public void OnStart()
{
    StartCoroutine(setImage("http://drive.google.com/myimage.jpg")); 
}

IEnumerator setImage(string url) 
{
    Texture2D texture = null;
    WWW www = new WWW(url);
    yield return www;

    Debug.Log("Why on earh is this never called?");
    texture = WWW.texture;
    //end show Image in texture 2D
}


来源:https://stackoverflow.com/questions/31765518/how-to-load-an-image-from-url-with-unity

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!