/// <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); }