読者です 読者をやめる 読者になる 読者になる

渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きく慣れるように。。。 ※所属団体とは一切関係がありません

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


f:id:esakun:20150730215258g:plain

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

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

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

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

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

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

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

成果物はこちら

f:id:esakun:20170413163956g:plain

今回分かりやすいように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: エディタ拡張で非同期処理サンプル

あわせてどうぞ

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info