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

エディットモード中(再生していない状態)にサーバーからファイルをダウンロードしてゴニョゴニョしたいことがあります。

例えば、特定のキャラクター情報を保持したJSONをダウンロードして、ローカルに保存し、それを元にキャラクターのアニメーションや設定を調整したりなどなど。

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

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

この数行で実現できます。

しかし、このようにコルーチンを使った処理になるため、ExecuteInEditModeを設定してもエディットモード中は動きません。

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

成果物はこちら

Unityエディットモード中にコルーチン処理を走らせる_0

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

ポイントはEditorApplication.updateを使って、エディットモード中でもフレーム更新処理が走るようにし、そこで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: エディタ拡張で非同期処理サンプル

期間限定 最大95%オフセール
効率UPメガバンドル開催中!最大95%オフ!!!
期間 : 11月1日午後15時59分まで
オススメ記事