bool TryLoadFromLocalStorage(AssetBundleRecord assetBundleRecord, Action <LoaderResult> onFinished) { var localPath = AssetBundleUtility.GetLocalStoragePath(assetBundleRecord.AssetBundleName); if (!File.Exists(localPath)) { return(false); } Debug.Log($"load from local storage: {localPath}"); byte[] bytes; try { using (FileStream fileStream = new FileStream(localPath, FileMode.Open, FileAccess.Read)) { bytes = new byte[fileStream.Length]; fileStream.Read(bytes, 0, bytes.Length); fileStream.Close(); } } catch (Exception e) { Debug.LogError(e); return(false); } var result = new LoaderResult(assetBundleRecord, bytes, null); onFinished.Invoke(result); return(true); }
public void EnqueueDownloadTask(AssetBundleRecord assetBundleRecord, Action <LoaderResult> onFinished) { if (isDestroyed) { return; } string assetBundleName = assetBundleRecord.AssetBundleName; if (taskDictionary.ContainsKey(assetBundleName)) { errorReceiver.OnError(AssetBundleErrorCode.DuplicatePath, $"duplicate path: {assetBundleName}"); return; } assetBundleRecordQueue.Enqueue(assetBundleRecord); var task = new DownloadTask(assetBundleRecord, onFinished, 0); taskDictionary.Add(assetBundleName, task); if (!isCheckingQueue) { coroutineOwner.Run(CheckQueueAsync()); isCheckingQueue = true; } }
public AssetBundleRecord CreateRecord(int action, int mcSystem, string filename, int version) { AssetBundleRecord r = new AssetBundleRecord(); r.action = action; r.filename = "MasterAssetManifest"; r.system = mcSystem; r.version = 1; return(r); }
public void Load(AssetBundleRecord assetBundleRecord, Action <LoaderResult> onFinished, bool forciblyDownload = false) { string assetBundleName = assetBundleRecord.AssetBundleName; if (!forciblyDownload && TryLoadFromLocalStorage(assetBundleRecord, onFinished)) { return; } actionDictionary.Add(assetBundleName, onFinished); downloadQueue.EnqueueDownloadTask(assetBundleRecord, downloadFinishedAction); }
public IEnumerator LoadAsync(AssetBundleRecord assetBundleRecord, Action <LoaderResult> onFinished) { string path = $"{url}{assetBundleRecord.AssetBundleName}"; Debug.Log($"download from web: {path}"); var request = UnityWebRequest.Get(path); request.downloadHandler = new DownloadHandlerBuffer(); request.SendWebRequest(); yield return(null); while (!request.isDone) { yield return(null); } if (request.isHttpError || request.isNetworkError) { var errorResult = new LoaderResult(assetBundleRecord, null, AssetBundleDownloadErrorType.Network); onFinished.Invoke(errorResult); yield break; } byte[] bytes = request.downloadHandler.data; var localPath = AssetBundleUtility.GetLocalStoragePath(assetBundleRecord.AssetBundleName); try { var dirPath = Path.GetDirectoryName(localPath); if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } using (FileStream fileStream = new FileStream(localPath, FileMode.OpenOrCreate, FileAccess.Write)) { fileStream.Write(bytes, 0, bytes.Length); fileStream.Close(); } } catch (Exception e) { Debug.LogError(e); var errorResult = new LoaderResult(assetBundleRecord, bytes, AssetBundleDownloadErrorType.IO); onFinished.Invoke(errorResult); yield break; } var successResult = new LoaderResult(assetBundleRecord, bytes, null); onFinished.Invoke(successResult); }
public static (AssetBundleTable oldTable, AssetBundleTable newTable) LoadTableData() { if (!Directory.Exists(cacheDir)) { Directory.CreateDirectory(cacheDir); } var oldTable = new AssetBundleTable(); if (File.Exists($"{cacheDir}/{GlobalSettings.TableFileName}")) { var json = File.ReadAllText($"{cacheDir}/{GlobalSettings.TableFileName}"); oldTable = JsonUtility.FromJson <AssetBundleTable>(json); } var records = new List <AssetBundleRecord>(); var newTable = new AssetBundleTable(); // AssetGraphからビルドを行うのでビルドマップを取得する。 var buildMap = UnityEngine.AssetGraph.AssetBundleBuildMap.GetBuildMap(); if (buildMap != null) { var platformName = GlobalSettings.GetPlatformName(); var assetBundleNames = buildMap.GetAllAssetBundleNames().ToList(); assetBundleNames.Add(platformName); // CRCとHashの取得方法 // https://qiita.com/satotin/items/9373ba3c5cc85172350c foreach (var assetBundleName in assetBundleNames) { var path = $"{exportAssetBundleLocation}/{assetBundleName}"; uint crc = 0; Hash128 hash; if (!BuildPipeline.GetCRCForAssetBundle(path, out crc)) { Debug.LogError("CRC Get Failed!!"); } if (!BuildPipeline.GetHashForAssetBundle(path, out hash)) { Debug.LogError("Hash Get Failed!!"); } Debug.Log($"AssetBundle path:{path} crc:{crc}, hash:{hash}"); var rec = new AssetBundleRecord(assetBundleName, crc, hash.ToString()); records.Add(rec); } } var version = oldTable.Version + 1; newTable.SetData(version, records.ToArray()); return(oldTable, newTable); }
public void CreateManifestData() { _assetManifestData = new AssetManifestData(); _assetManifestData.AssetBundleDataSet = "MasterAssetManifest"; _assetManifestData.version = "0.0.1"; _assetManifestData.AssetBundleList = new List <AssetBundleRecord>(); AssetBundleRecord record = CreateRecord ( (int)ManifestAction.Nominal, (int)MCSystem.PantryItems, "pantryitems001", 1 ); _assetManifestData.AssetBundleList.Add(record); record = CreateRecord ( (int)ManifestAction.Nominal, (int)MCSystem.PlatingTables, "platingtables", 1 ); _assetManifestData.AssetBundleList.Add(record); record = CreateRecord ( (int)ManifestAction.Nominal, (int)MCSystem.SearchTags, "mastertaglistbundle", 1 ); _assetManifestData.AssetBundleList.Add(record); record = CreateRecord ( (int)ManifestAction.Update, (int)MCSystem.IgniteEvents, "noop", 1 ); _assetManifestData.AssetBundleList.Add(record); SaveJsonData(); }
IEnumerator CheckQueueAsync() { while (taskDictionary.Count > 0) { while (assetBundleRecordQueue.Count > 0 && downloadingCount < MaxDownloadingCount) { AssetBundleRecord record = assetBundleRecordQueue.Dequeue(); coroutineOwner.Run(downloader.LoadAsync(record, downloadFinishedAction)); downloadingCount++; if (TimeUtility.DropFrameExists()) { break; } } yield return(null); } isCheckingQueue = false; }
public LoaderResult(AssetBundleRecord assetBundleRecord, byte[] bytes, AssetBundleDownloadErrorType?errorType = null) { this.AssetBundleRecord = assetBundleRecord; this.Bytes = bytes; this.ErrorType = errorType; }
public DownloadTask(AssetBundleRecord assetBundleRecord, Action <LoaderResult> onFinished, int triedCount) { this.AssetBundleRecord = assetBundleRecord; this.OnFinished = onFinished; this.TriedCount = triedCount; }