こんにちは、Unityエンジニアのオオバです。
UnityのEditモード中(再生していない状態)に、
サーバーからファイルをダウンロードして処理したいことがあります。
以下のような例です。
- 特定のキャラクター情報を保持したJSONをダウンロード
- JSONをローカルに保存
- キャラクターのアニメーションや設定を調整
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モード中にコルーチンを動かす方法

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

この記事が気に入ったらフォローしよう
オススメ記事