Por favor, sálvame de volverme loco.
No importa cuántas veces busque en Google, siempre termino con versiones (generalmente obsoletas) del siguiente código:
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; }Estoy usando Unity 5, no 4. La URL que intento cargar existe. Por favor, brille un poco de luz sobre mí.
¿Cómo cargo una imagen a través de HTTP y la muestro en UnityEngine.UI.Image?
Para Unity 2018+, use UnityWebRequest que reemplaza la clase WWW .
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; }Puedes hacer eso con async/await:
using System.Threading.Tasks; using UnityEngine; using UnityEngine.Networking; public static async Task<Texture2D> GetRemoteTexture ( string url ) { using( UnityWebRequest www = UnityWebRequestTexture.GetTexture(url) ) { // begin request: 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 ) // if( www.result!=UnityWebRequest.Result.Success )// for Unity >= 2020.1 { // 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); } } }Ejemplo de uso:
[SerializeField] string _imageUrl; [SerializeField] Material _material; Texture2D _texture; async void Start () { _texture = await GetRemoteTexture(_imageUrl); _material.mainTexture = _texture; } void OnDestroy () => Dispose(); public void Dispose () => Object.Destroy(_texture);// memory released, leak otherwiseaclaración rápida: 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; }