/// <summary> /// write manifest into target path. /// </summary> static void WriteManifestFile(string path, IBundleBuildResults bundleResults, BuildTarget target, string remoteURL) { var manifest = new AssetbundleBuildManifest(); manifest.BuildTarget = target.ToString(); //we use unity provided dependency result for final check var deps = bundleResults.BundleInfos.ToDictionary(kv => kv.Key, kv => kv.Value.Dependencies.ToList()); foreach (var result in bundleResults.BundleInfos) { var bundleInfo = new AssetbundleBuildManifest.BundleInfo(); bundleInfo.BundleName = result.Key; bundleInfo.Dependencies = Utility.CollectBundleDependencies(deps, result.Key); bundleInfo.Hash = result.Value.Hash; bundleInfo.Size = new FileInfo(result.Value.FileName).Length; manifest.BundleInfos.Add(bundleInfo); } //sort by size manifest.BundleInfos.Sort((a, b) => b.Size.CompareTo(a.Size)); var manifestString = JsonUtility.ToJson(manifest); manifest.GlobalHash = Hash128.Compute(manifestString); manifest.BuildTime = DateTime.UtcNow.Ticks; manifest.RemoteURL = remoteURL; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } File.WriteAllText(Utility.CombinePath(path, AssetbundleBuildSettings.ManifestFileName), JsonUtility.ToJson(manifest, true)); }
public LoadedBundle(AssetbundleBuildManifest.BundleInfo info, string loadPath, AssetBundle bundle, bool isLocal) { Name = info.BundleName; IsLocalBundle = isLocal; LoadPath = loadPath; Bundle = bundle; Hash = info.Hash; Dependencies = info.Dependencies; Dependencies.Add(Name); }
public LoadedBundle(AssetbundleBuildManifest.BundleInfo info, string loadPath, AssetBundle bundle, bool isLocal) { Name = info.BundleName; IsLocalBundle = isLocal; LoadPath = loadPath; Bundle = bundle; Hash = info.Hash; AssetNames = new HashSet <string>(bundle.GetAllAssetNames()); Dependencies = info.Dependencies; }
static IEnumerator CoInitalizeLocalBundles(BundleAsyncOperation result, bool autoReloadBundle) { if (Initialized) { result.Done(BundleErrorCode.Success); yield break; } AutoReloadBundle = autoReloadBundle; if (LogMessages) { Debug.Log($"LocalURL : {LocalURL}"); } foreach (var kv in s_AssetBundles) { kv.Value.Bundle.Unload(false); } s_SceneNames.Clear(); s_AssetBundles.Clear(); s_LocalBundles.Clear(); var manifestReq = UnityWebRequest.Get(Utility.CombinePath(LocalURL, AssetbundleBuildSettings.ManifestFileName)); yield return(manifestReq.SendWebRequest()); if (manifestReq.isHttpError || manifestReq.isNetworkError) { result.Done(BundleErrorCode.NetworkError); yield break; } if (!AssetbundleBuildManifest.TryParse(manifestReq.downloadHandler.text, out var localManifest)) { result.Done(BundleErrorCode.ManifestParseError); yield break; } //cached version is recent one. var cacheIsValid = AssetbundleBuildManifest.TryParse(PlayerPrefs.GetString("CachedManifest", string.Empty), out var cachedManifest) && cachedManifest.BuildTime > localManifest.BuildTime; result.SetIndexLength(localManifest.BundleInfos.Count); for (int i = 0; i < localManifest.BundleInfos.Count; i++) { result.SetCurrentIndex(i); result.SetCachedBundle(true); AssetbundleBuildManifest.BundleInfo bundleInfoToLoad; AssetbundleBuildManifest.BundleInfo cachedBundleInfo = default; var localBundleInfo = localManifest.BundleInfos[i]; bool useLocalBundle = !cacheIsValid || //cache is not valid or... !cachedManifest.TryGetBundleInfo(localBundleInfo.BundleName, out cachedBundleInfo) || //missing bundle or... !Caching.IsVersionCached(cachedBundleInfo.AsCached); //is not cached no unusable. bundleInfoToLoad = useLocalBundle ? localBundleInfo : cachedBundleInfo; var loadPath = Utility.CombinePath(LocalURL, bundleInfoToLoad.BundleName); var bundleReq = UnityWebRequestAssetBundle.GetAssetBundle(loadPath, bundleInfoToLoad.Hash); var bundleOp = bundleReq.SendWebRequest(); while (!bundleOp.isDone) { result.SetProgress(bundleOp.progress); yield return(null); } if (!bundleReq.isHttpError && !bundleReq.isNetworkError) { var loadedBundle = new LoadedBundle(bundleInfoToLoad, loadPath, DownloadHandlerAssetBundle.GetContent(bundleReq), useLocalBundle); s_AssetBundles.Add(localBundleInfo.BundleName, loadedBundle); CollectSceneNames(loadedBundle); if (LogMessages) { Debug.Log($"Local bundle Loaded - Name : {localBundleInfo.BundleName}, Hash : {bundleInfoToLoad.Hash }"); } } else { result.Done(BundleErrorCode.NetworkError); yield break; } bundleReq.Dispose(); s_LocalBundles.Add(localBundleInfo.BundleName, localBundleInfo.Hash); } RemoteURL = Utility.CombinePath(localManifest.RemoteURL, localManifest.BuildTarget); #if UNITY_EDITOR if (s_EditorBuildSettings.EmulateWithoutRemoteURL) { RemoteURL = "file://" + Utility.CombinePath(s_EditorBuildSettings.RemoteOutputPath, UnityEditor.EditorUserBuildSettings.activeBuildTarget.ToString()); } #endif Initialized = true; if (LogMessages) { Debug.Log($"Initialize Success \nRemote URL : {RemoteURL} \nLocal URL : {LocalURL}"); } result.Done(BundleErrorCode.Success); }