2016-08-24 9 views
1

ローカルイメージを非同期に読み込みたいのですが、 "sprite.create"に時間がかかり、UIが停止します。これをどうすれば解決できますか?ローカルイメージを非同期にロードするにはどうしたらいいですか?

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

    Texture2D texture = new Texture2D(4, 4, TextureFormat.ARGB32, true); 
    www.LoadImageIntoTexture(texture); 
    www.Dispose(); 
    www = null; 

    curTexture = texture; 
    img.sprite = Sprite.Create (curTexture, new Rect (0, 0, curTexture.width, curTexture.height), new Vector2 (0.5f, 0.5f)); 

アップデート2016年8月26日:

私はスプライトにテクスチャを変更する必要があるイメージを使用するのではなく、テクスチャを設定するためにRawImageを使用しました。

もう1つの質問は、www.LoadImageIntoTextureも非常に時間がかかることです。以前はwww.textureを使っていましたが、青い画像を表示するアンドロイドデバイスからPNGを読み込めなかったことがわかりました。

+0

このコードがどのように内部にあるかを示してください。 –

+1

また、 'Texture2D texture = ...'行を取り除き、 'curTexture = www.texture;'を実行することを検討しましたか? –

+1

UI.Imageの代わりにUI.RawImageを使用して、[RawImage.texture](http://www.Image.com)に[WWW.texture](https://docs.unity3d.com/ScriptReference/WWW-texture.html) /docs.unity3d.com/ScriptReference/UI.RawImage-texture.html) – JeanLuc

答えて

2

私のコメントで述べたように「私はtexture propertyを有し、RawImageを使用することをお勧めしますので、あなたはドンスプライトを作成する必要があります。

[SerializeField] private RawImage _rawImage; 

public void DownloadImage(string url) 
{ 
    StartCoroutine(DownloadImageCoroutine(url)); 
} 

private IEnumerator DownloadImageCoroutine(string url) 
{ 
    using (WWW www = new WWW(url)) 
    { 
     // download image 
     yield return www; 

     // if no error happened 
     if (string.IsNullOrEmpty(www.error)) 
     { 
      // get texture from WWW 
      Texture2D texture = www.texture; 

      yield return null; // wait a frame to avoid hang 

      // show image 
      if (texture != null && texture.width > 8 && texture.height > 8) 
      { 
       _rawImage.texture = texture; 
      } 
     } 
    } 
} 
1

呼び出し、これを使用してコルーチン:

StartCoroutine(eImageLoad(filepath)); 

そして、ここでは定義です:

IEnumerator eImageLoad(string path) 
{ 
    WWW www = new WWW (path); 

    //As @ Scott Chamberlain suggested in comments down below 
    yield return www; 

    //This is longer but more explanatory 
    //while (false == www.isDone) 
    //{ 
    // yield return null; 
    //} 

    //As @ Scott Chamberlain suggested in comments you can get the texture directly 

    curTexture = www.Texture; 

    www.Dispose(); 
    www = null; 

    img.sprite = Sprite.Create (curTexture, new Rect (0, 0, curTexture.width, curTe 
} 
+1

なぜwhileループですか? 'yield return www;'を実行するだけです。 'WWW'クラスは、yieldを返します(https://docs.unity3d.com/ScriptReference/WWW.html)。 –

+0

はい、できますが、わかりやすくするために編集しました。 – Cabrra

+0

さて、私は今、コメントを見ています(私は前にそれを見逃していました)が、あなたはまだあなたがそれを変更した理由を説明していません。 –

関連する問題