うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】EditorWindow 上で サーバから画像をロードする

UnityWebRequestTexture を利用して画像をロードしますが
これは EditorWindow では コルーチン を利用できないので EditorApplication.update を利用して画像のロードを待ちます

private void LoadTexture(string path)
{
    var request = UnityWebRequestTexture.GetTexture(path);
    request.SendWebRequest();
    EditorApplication.CallbackFunction callback = null;
    callback = () => {
        if (!request.isDone)
            return;

        if (request.isHttpError || request.isNetworkError)
        {
            Debug.LogError(request.error);
        }
        else
        {
            _Texture = ((DownloadHandlerTexture)request.downloadHandler).texture;
        }

        EditorApplication.update -= callback;
    };

    EditorApplication.update += callback;
}

サンプル

おなじみイラストやさんからお借りしてロードボタンを押すと画像が表示されます

f:id:hacchi_man:20200919015300p:plain:w300

using UnityEditor;
using UnityEngine;
using UnityEngine.Networking;
 
public class SampleEditorWindow : EditorWindow
{
    [SerializeField]
    private Texture2D _Texture;
  
    private const string Path =
        "https://1.bp.blogspot.com/-tWP38QNcn04/X1CK4cXnvjI/AAAAAAABavY/W2xyveWsZCggkTecEC_tEjaBBhCTUmXkQCNcBGAsYHQ/s400/daidougei_cigar_box_woman.png"; 
     
    private void OnGUI()
    {
        if (GUILayout.Button("Load"))
        {
            LoadTexture(Path);
        }
 
        if (_Texture != null)
        {
            var rect = GUILayoutUtility.GetRect(
                0,
                0,
                GUILayout.MaxWidth(200),
                GUILayout.MaxHeight(200)
            );
 
            EditorGUI.DrawTextureTransparent(rect, _Texture);
        }
    }
 
    private void LoadTexture(string path)
    {
        var request = UnityWebRequestTexture.GetTexture(path);
        request.SendWebRequest();
        EditorApplication.CallbackFunction callback = null;
        callback = () => {
            if (!request.isDone)
                return;
 
            if (request.isHttpError || request.isNetworkError)
            {
                Debug.LogError(request.error);
            }
            else
            {
                _Texture = ((DownloadHandlerTexture)request.downloadHandler).texture;
            }
 
            EditorApplication.update -= callback;
        };

        EditorApplication.update += callback;
    }
}