こんにちは、Unityエンジニアのオオバです。

UnityのEditモード中(再生していない状態)に、
サーバーからファイルをダウンロードして処理したいことがあります。

以下のような例です。

  1. 特定のキャラクター情報を保持したJSONをダウンロード
  2. JSONをローカルに保存
  3. キャラクターのアニメーションや設定を調整

UnityではWWWやWebRequestクラスを使うと簡単に通信ができます。
今回はWWWを使用。

var www = new WWW("https://sample.co.jp/huga.json");  
yield return www;  
Debug.Log(www.text);  

数行で通信が実現できるのです。

しかし、WWWやWebRequestはコルーチンを使います。
コルーチンはUnity実行中のみ動く のです。

つまりEditモード中にWWWやWebRequestが使えないということ。

Editモード中にスクリプトを動かす ExecuteInEditMode もコルーチンは動作しませんでした。

そこでエディタ拡張してコルーチンを動かしてみます。

コルーチンを徹底解説した記事を書きました。
ちょっとコルーチンに不安を抱えているのであれば一度読んでみてください。

Editモード中にコルーチンを動かす方法

【Unity】Editモード中にコルーチンを実行する方法_0

今回分かりやすいようにJSONではなく、pngファイルをダウンロードして、エディタウィンドウに画像を表示しています。

ポイントはEditorApplication.updateを使って、
Editモード中でもフレーム更新処理が走るようにし、
そこでWWWクラスのインスタンスを処理しています。

つまりコルーチンの内部処理を実装した形になります。

void OnEnable ()  
{
    EditorApplication.update += OnUpdate;  
}

Texture2D tex;  

void OnUpdate()  
{
    if (www == null) return;  

    www.MoveNext();  
    if (www.isDone)  
    {
        // ダウンロードしたテクスチャを取得  
        tex = www.texture;  
        www = null;  
    }
}

抜粋 & 記事用に調整したコードですが、このようにフレームアップデート内でMoveNext関数を呼んでいます。
yieldが使えない状況なので、それと同じような処理を自前で書いて動かしています。

ソースコードはこちら

GitHub - baobao/EditorImgLoader: エディタ拡張で非同期処理サンプル

オススメ記事