2016-09-21 5 views
1

Unityを使用して、実行時に複数のpngファイルをロードしたいと思います。私は与えられたディレクトリでテクスチャをロードするためにwwwクラスを使用しています。私のコードは以下の通りです:WWWクラスで複数の外部テクスチャをロード

public IEnumerator LoadPNG(string _path) 
    { 
     string[] filePaths = Directory.GetFiles(_path); 
     foreach (string fileDir in filePaths) 
     { 
      using (WWW www = new WWW("file://" + Path.GetFullPath(fileDir))) 
      { 
       yield return www; 
       Texture2D texture = Texture2D.whiteTexture; 
       www.LoadImageIntoTexture(texture); 
       this.textureList.Add(texture); 
      } 
     } 
    } 

この機能はコルーチンと呼ばれています。プログラムがすべてのテクスチャの読み込みを終了すると、textureList配列には正しい量のテクスチャがあります。しかし、それらのすべてが最後にテクスチャをロードされます。どんな助けもありがとうございます。

+1

この行(Texture2D texture = Texture2D.whiteTexture;)では、常に同じオブジェクトに参照を設定します。新しいテクスチャを初期化する必要があります。私は(新しいTexture2D)で動作すると思います。 – NtFreX

+0

新しいTexture2Dをリソースなしで直接1つに表現することはできません。私はすでにLoadImageIntoTextureテクスチャによってテクスチャ変数を上書きしています。だから私は思うべき問題ではありません。 – mcelik

+0

@mcelik 'Texture2D'で' new'キーワードを使うことができます。あなたのコードを更新したのでこれがあなたの問題だと思います。 'Texture2D texture = new Texture2D(4,4、TextureFormat.DXT1、false);' – Programmer

答えて

3

あなたは、1つのオブジェクトのみ使用で小さなミスをしていた:博士FREもコメントで述べたように

  using (WWW www = new WWW("file://" + Path.GetFullPath(fileDir))) 
      { 
       yield return www; 
       // Change this... 
       //Texture2D texture = Texture2D.whiteTexture; 
       // to this: 
       Texture2D texture = new Texture2D(0, 0); 
       //or us this: 
       //Texture2D texture = www.texture; 
       www.LoadImageIntoTexture(texture); 
       textureList.Add(texture); 
      } 

を。

+0

現在の彼の質問には、これが解決策です。 – Programmer

+0

これは解決策です。皆さん、ありがとうございました。 – mcelik

1

ここでは簡単な間違い:using (WWW www = new WWW("file://" + Path.GetFullPath(_path)))です。

foreachループのurlfileDirです。

EDIT

また機能外側textureList = new List<Texture2D>();を動かします。 Start()機能の中に入れてください。

public IEnumerator LoadPNG(string _path) 
    { 
     string[] filePaths = Directory.GetFiles(_path); 
     foreach (string fileDir in filePaths) 
     { 
      using (WWW www = new WWW("file://" + Path.GetFullPath(fileDir))) 
      { 
       yield return www; 
       Texture2D texture = Texture2D.whiteTexture; 
       www.LoadImageIntoTexture(texture); 
       textureList.Add(texture); 
      } 
     } 
    } 

:それはforループの代わりに、ユニティでforeachループでListにわたってループ処理をお勧めします。 Unity 5.5ではこれについて心配する必要はありません。

+0

私の間違い。私の作業コードはfileDirを使用しています。しかし、それは間違って書いています:/今編集されています。 – mcelik

+0

@mcelik編集を見てください。 'textureList = new Dictionary ();'を 'LoadPNG'関数の外側に移動します。また、あなたの質問には別のタイプミスがあると思います。 'textureList = new Dictionary ();'テクスチャリスト=新しいリスト(); 'そうでなければ、 'textureList.Add(texture);'はコンパイルすべきではありません。あなたの質問でそれを修正してください....あなたの質問にこのような問題を防ぐために、常にあなたのコードを入れてみてください。 – Programmer

+0

最新のコードの編集版は、この質問に対してより明確になります。ありがとうございました。 – mcelik

関連する問題