Top > ComputerGraphics > Unity > Tips > Script > LoadFileByUsingWWW
Last-modified: Tue, 16 Apr 2013 12:26:29 JST
Counter:20601 Today:2 Yesterday:6 Online:6
このエントリーをはてなブックマークに追加

WWWクラスを利用して動的にファイルを読み込む

About

WWWを利用すると、文字通りネットワーク上からデータを引き込むことができますが、それ以外に、ローカルのファイルも読み込むことができます。"動的にアセットを読み込む方法"の解説では、対象のファイルはResourcesフォルダの中に置かれている必要がありましたが、WWWクラスを利用する方法では、これらの制限はなくなります。

HowTo

WWWは読み込み後にその変数(プロパティ)から読み込んだデータを取得することができます。変数の種類については多数用意されているので公式から確認してください。

ここでは外部の画像ファイルを読み込み、テクスチャとして適用するような例を考えます。指定するURLがローカルファイルである場合には、そのパスの先頭に"file://"をつける必要があります。

    var url = "file://C:/Sample/SampleTexture.png";
    var www : WWW = new WWW (url);
 
    yield www;
 
    renderer.material.mainTexture = www.texture; 

yieldは、ダウンロードが終了してから、つまり読み込みが完了してから次の処理を実行させるために必要な手順です。ここでは画像を読み込んでテクスチャにする例をあつかっていますが、読み込みが完了する前にテクスチャを適用すると不具合が起きます。したがって読み込みまで待機するためにyieldが必要です。

javascriptではyieldの挙動の都合などから容易に実装することができるのですがC#では少々手を加えてやる必要があります。StartCoroutineメソッドを利用して実行するようなメソッドを用意するのが最も現実的な実装方法ではないでしょうか。

    StartCoroutine(SetLocalTexture
         (gameObject, Application.dataPath + "/Sample/SampleTexture.png"));

    IEnumerator SetLocalTexture(GameObject gameObject, string filePath)
    {
        WWW file = new WWW("file://" + filePath);
        yield return file;
        gameObject.renderer.material.mainTexture = file.texture;
    }

次のようなエラーが出る場合

  • You are trying to load data from a www stream which had the following error when downloading. Could not resolve host: (ドライブ名) Host not found
    • "file://"をファイルパスの先頭に付け忘れている可能性があります。
  • You are trying to load data from a www stream which had the following error when downloading. Couldn't open file (ファイルパス)
    • ファイルパスを間違えているか、OSや他のアプリケーションがリソースを占有している可能性があります。