/// <summary>
 /// サーバから複数のアセットバンドルをダウンロードします。
 /// </summary>
 /// <param name="assetBundleNames">サーバからダウンロードするアセットバンドルを複数指定します。</param>
 /// <param name="update">ダウンロードの進捗状況が0.0~1.0のfloat形式で返されます。</param>
 public static void DownloadAssetBundle(string[] assetBundleNames, OnDownloadProgressUpdate update)
 {
     // 初期化済みかどうかチェック
     if (!initialized)
     {
         return;
     }
     // ダウンロード開始
     instance.StartCoroutine(Download(assetBundleNames, update));
 }
    // サーバからアセットバンドルをダウンロードする
    private static IEnumerator Download(string[] assetBundleNames, OnDownloadProgressUpdate update)
    {
        // キャッシュできる状態か確認
        while (!Caching.ready)
        {
            yield return(null);
        }

        // アセットバンドルを全てダウンロードするまで回す
        fileIndex = 0;
        do
        {
            // baseURLにAssetBuddle名を付与してURL生成
            string bundleName  = assetBundleNames[fileIndex];
            string url         = baseURL + bundleName;
            string manifestURL = url + ".manifest";
            // URLキャッシュ防止のためタイムスタンプを付与
            url         += ((url.Contains("?")) ? "&" : "?") + "t=" + DateTime.Now.ToString("yyyyMMddHHmmss");
            manifestURL += ((manifestURL.Contains("?")) ? "&" : "?") + "t=" + DateTime.Now.ToString("yyyyMMddHHmmss");

            // CRCチェックを行うか確認
            // manifestファイルをDL
            UnityWebRequest wwwManifest = UnityWebRequest.Get(manifestURL);
            // ダウンロードを待つ
            yield return(wwwManifest.SendWebRequest());

            // manifestが存在していた場合はCRCチェックをする
            uint latestCRC = 0;
            if (string.IsNullOrEmpty(wwwManifest.error))
            {
                // manifest内部のCRCコードを抽出する
                string[] lines = wwwManifest.downloadHandler.text.Split(new string[] { "CRC: " }, StringSplitOptions.None);
                latestCRC = uint.Parse(lines[1].Split(new string[] { "\n" }, StringSplitOptions.None)[0]);

#if UNITY_2017_1_OR_NEWER
                // キャッシュを個別削除する
                string key = "km_assetbundleversioncache_" + bundleName;
                if (PlayerPrefs.HasKey(key))
                {
                    string currentCRC = PlayerPrefs.GetString(key);
                    if (currentCRC != latestCRC.ToString())
                    {
                        PlayerPrefs.SetString(key, latestCRC.ToString()); // 新しいcrcを保存
                        Caching.ClearAllCachedVersions(bundleName);       // 既存のキャッシュを削除
                    }
                    Debug.Log("[" + bundleName + ".manifest] \n" + "Latest CRC : " + latestCRC + "  Current CRC: " + currentCRC);
                }
                else
                {
                    PlayerPrefs.SetString(key, latestCRC.ToString()); // 新しいcrcを保存
                }
                latestCRC = 0;
#endif
            }
            else
            {
                Debug.Log(bundleName + ".manifest has not found.");
            }

            // CRCチェックしてダウンロード開始
            using (UnityWebRequest www = UnityWebRequest.GetAssetBundle(url, ver, latestCRC))
            {
                // ダウンロード開始
                www.SendWebRequest();
                // ダウンロードが完了するまでプログレスを更新する
                while (www.downloadProgress < 1f)
                {
                    // progress設定
                    float progress = 0f;
                    if (www.downloadProgress > 0)
                    {
                        progress = www.downloadProgress;
                    }
                    // 更新する
                    update(progress, fileIndex, false, www.error);
                    yield return(new WaitForEndOfFrame());
                }

                // エラー処理
                if (!string.IsNullOrEmpty(www.error))
                {
                    // 完了通知
                    update(0f, fileIndex, false, www.error);
                    string err = www.error;
                    Debug.Log(www.error);
                    // wwwを解放する
                    www.Dispose();
                    throw new Exception("WWW download had an error:" + err);
                }
                // ロードしたアセットバンドルをセット
                AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(www);

                // AssetBundle内部に同名のCRYPTO_SIGNがあった場合、暗号化Assetと判断して復号する
                if (bundle.Contains(CRYPTO_SIGN + bundle.name))
                {
                    bundle = DecryptingAssetBundle(bundle);
                    yield return(bundle);
                }
                bundleDic.Add(bundleName, bundle);
                // wwwを解放する
                www.Dispose();
            }
        } while (++fileIndex < assetBundleNames.Length);

        // 完了通知
        update(1f, fileIndex, true, null);
    }
 /// <summary>
 /// サーバからアセットバンドルをダウンロードします。
 /// </summary>
 /// <param name="assetBundleName">サーバからダウンロードするアセットバンドルをひとつ指定します。</param>
 /// <param name="update">ダウンロードの進捗状況がコールバックで返されます。</param>
 public static void DownloadAssetBundle(string assetBundleName, OnDownloadProgressUpdate update)
 {
     // DownloadAssetBundleを実行
     DownloadAssetBundle(new string[] { assetBundleName }, update);
 }
 /// <summary>
 /// サーバからアセットバンドルをダウンロードします。
 /// </summary>
 public void DownloadAssetBundle(string[] assetBundleNames, OnDownloadProgressUpdate update)
 {
     //  ダウンロード開始
     StartCoroutine (Download (assetBundleNames, update));
 }
    // サーバからアセットバンドルをダウンロードする
    IEnumerator Download(string[] assetBundleNames, OnDownloadProgressUpdate update)
    {
        // アセットバンドルを全てダウンロードするまで回す
        fileIndex = 0;
        do {
            // キャッシュできる状態か確認
            while (!Caching.ready)
                yield return null;

            // iOSとAndroidでアセットバンドルのディレクトリを分ける
            string url = baseURL + assetBundleNames[fileIndex];

            // CRCチェックを行うか確認
            // manifestファイルをDL
            WWW wwwManifest = new WWW(url + ".manifest");
            // ダウンロードを待つ
            yield return wwwManifest;

            // manifestが存在していた場合はCRCチェックをする
            if (wwwManifest.error == null) {
                // manifest内部のCRCコードを抽出する
                string[] lines = wwwManifest.text.Split(new string[]{"CRC: "}, StringSplitOptions.None);
                uint crc = uint.Parse(lines[1].Split(new string[]{"\n"}, StringSplitOptions.None)[0]);

                Debug.Log("CRC : "+crc);

                // CRCチェックしてダウンロード開始
                using(WWW www = WWW.LoadFromCacheOrDownload (url, ver, crc)) {
                    // ダウンロードが完了するまでプログレスを更新する
                    while(!www.isDone) {
                        // 更新する
                        update(www.progress, fileIndex, false, www.error);
                        yield return new WaitForEndOfFrame();
                    }

                    // エラー処理
                    if (www.error != null) {
                        // 完了通知
                        update (www.progress, fileIndex, false, www.error);
                        throw new Exception("WWW download had an error:" + www.error);
                    }
                    // wwwを解放する
                    www.Dispose ();
                }

            }
            else {
                Debug.Log(assetBundleNames[fileIndex]+".manifest has not found.");

                // CRCチェックしてダウンロード開始
                using(WWW www = WWW.LoadFromCacheOrDownload (url, ver)){
                    // ダウンロードが完了するまでプログレスを更新する
                    while(!www.isDone) {
                        // 更新する
                        update(www.progress, fileIndex, false, www.error);
                        yield return new WaitForEndOfFrame();
                    }

                    // エラー処理
                    if (www.error != null) {
                        // 完了通知
                        update (www.progress, fileIndex, false, www.error);
                        throw new Exception("WWW download had an error:" + www.error);
                    }
                    // wwwを解放する
                    www.Dispose ();
                }
            }

        } while(++fileIndex < assetBundleNames.Length);

        // 完了通知
        update (1f, fileIndex, true, null);
    }