うにてぃブログ

UnityやUnreal Engineの記事を書いていきます

【Unity】UnityWebRequest で ファイルを保存する方法

UnityWebRequest でファイルを保存するには request.downloadHandler = new DownloadHandlerFile(savePath); を指定する

ロードする前にファイルのチェック処理を書かないと再度ロードされてしまうので、ちゃんとチェック処理を書きましょう

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using System.IO;
 
public class SampleMonoBehaviour : MonoBehaviour
{
    [SerializeField]
    private SpriteRenderer _sprite;
 
    private const string URI = "https://1.bp.blogspot.com/-tWP38QNcn04/X1CK4cXnvjI/AAAAAAABavY/W2xyveWsZCggkTecEC_tEjaBBhCTUmXkQCNcBGAsYHQ/s400/daidougei_cigar_box_woman.png";
 
    private IEnumerator Start()
    {
        var saveRoot = Path.Combine(Application.temporaryCachePath, "Cache");
        var savePath = Path.Combine(saveRoot, "test.png");
 
        yield return LoadAndSaveTexture(URI, savePath);
 
        _sprite.sprite = GetTexture(savePath);
    }
 
    /// <summary>
    /// キャッシュからテクスチャをロード
    /// </summary>
    private Sprite GetTexture(string savePath)
    {
        // ファイルがなければ null
        if (!File.Exists(savePath))
            return null;
 
        // 保存してあるテクスチャのロード
        var texture = new Texture2D(0, 0);
        texture.LoadImage(File.ReadAllBytes(savePath));

        // Sprite に変換
        return Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero);
    }
 
    /// <summary>
    /// ファイルをロード
    /// ファイルがあればロードしない
    /// </summary>
    private IEnumerator LoadAndSaveTexture(string uri, string savePath)
    {
        // ファイルがあるので終了
        if (Directory.Exists(savePath))
            yield break;
 
        var dir = Path.GetDirectoryName(savePath);
        // ディレクトリがなければ作成する
        if (!Directory.Exists(dir))
            Directory.CreateDirectory(dir);
 
        using (var request = UnityWebRequestTexture.GetTexture(uri))
        {
            request.disposeUploadHandlerOnDispose = false;
            // ファイルを保存
            request.downloadHandler = new DownloadHandlerFile(savePath);

            yield return request.SendWebRequest();

            if (request.isHttpError || request.isNetworkError)
                Debug.LogError(request.error);
        }
    }
}