// 异步请求Assetbundle资源,AB是否缓存取决于是否设置为常驻包,Assets一律缓存,处理依赖 public BaseAssetBundleAsyncLoader LoadAssetBundleAsync(string assetbundleName) { #if UNITY_EDITOR if (AssetBundleConfig.IsEditorMode) { return new EditorAssetBundleAsyncLoader(assetbundleName); } #endif var loader = AssetBundleAsyncLoader.Get(); prosessingAssetBundleAsyncLoader.Add(loader); if (manifest != null) { string[] dependancies = manifest.GetAllDependencies(assetbundleName); for (int i = 0; i < dependancies.Length; i++) { var dependance = dependancies[i]; if (!string.IsNullOrEmpty(dependance) && dependance != assetbundleName) { CreateAssetBundleAsync(dependance); // A依赖于B,A对B持有引用 IncreaseReferenceCount(dependance); } } loader.Init(assetbundleName, dependancies); } else { loader.Init(assetbundleName, null); } CreateAssetBundleAsync(assetbundleName); // 加载器持有的引用:同一个ab能同时存在多个加载器,等待ab创建器完成 IncreaseReferenceCount(assetbundleName); return loader; }
// 异步请求Assetbundle资源,AB是否缓存取决于是否设置为常驻包,Assets一律缓存,处理依赖 public BaseAssetBundleAsyncLoader LoadAssetBundleAsync(string assetbundleName) { #if UNITY_EDITOR if (AssetBundleConfig.IsEditorMode) { return(new EditorAssetBundleAsyncLoader(assetbundleName)); } #endif /// 这是想是保证加载顺序的, 在 AssetPrefab 里要注意了 var loader = AssetBundleAsyncLoader.Get(); prosessingAssetBundleAsyncLoader.Add(loader); if (manifest != null) { string[] dependancies = manifest.GetAllDependencies(assetbundleName); loader.Init(assetbundleName, dependancies); //for (int i = 0; i < dependancies.Length; i++) //{ // var dependance = dependancies[i]; // if (!string.IsNullOrEmpty(dependance) && dependance != assetbundleName) // { // CreateAssetBundleAsync(dependance); // } //} //loader.Init(assetbundleName, dependancies); } else { loader.Init(assetbundleName, null); } //CreateAssetBundleAsync(assetbundleName); return(loader); }
// 异步请求Assetbundle资源,AB是否缓存取决于是否设置为常驻包,Assets一律缓存,处理依赖 public BaseAssetBundleAsyncLoader LoadAssetBundleAsync(string assetbundleName, string path = null) { #if UNITY_EDITOR if (AssetBundleConfig.IsEditorMode) { KVDebugHelper.Instance.AddAssetInfo(path, assetbundleName); if (path != null && File.Exists(path)) { return(new EditorAssetBundleAsyncLoader(assetbundleName)); } } #endif bool isIndependent = false; var loader = AssetBundleAsyncLoader.Get(); prosessingAssetBundleAsyncLoader.Add(loader); // Debug.Log($"{assetbundleName} hash {manifest.GetAssetBundleHash(assetbundleName)} isValid:{manifest.GetAssetBundleHash(assetbundleName).isValid}"); // Debug.Log($"{assetbundleName} hash {idpManifest.GetAssetBundleHash(assetbundleName)} isValid:{idpManifest.GetAssetBundleHash(assetbundleName).isValid}"); if (manifest != null && manifest.GetAssetBundleHash(assetbundleName).isValid) { string[] dependancies = manifest.GetAllDependencies(assetbundleName); for (int i = 0; i < dependancies.Length; i++) { var dependance = dependancies[i]; if (!string.IsNullOrEmpty(dependance) && dependance != assetbundleName) { CreateAssetBundleAsync(dependance); // A依赖于B,A对B持有引用 IncreaseReferenceCount(dependance); } } loader.Init(assetbundleName, dependancies); } else if (idpManifest != null && idpManifest.GetAssetBundleHash(assetbundleName).isValid) { isIndependent = true; string[] dependancies = idpManifest.GetAllDependencies(assetbundleName); for (int i = 0; i < dependancies.Length; i++) { var dependance = dependancies[i]; if (!string.IsNullOrEmpty(dependance) && dependance != assetbundleName) { CreateAssetBundleAsync(dependance); // A依赖于B,A对B持有引用 IncreaseReferenceCount(dependance); } } loader.Init(assetbundleName, dependancies); } else { loader.Init(assetbundleName, null); } CreateAssetBundleAsync(assetbundleName, isIndependent); // 加载器持有的引用:同一个ab能同时存在多个加载器,等待ab创建器完成 IncreaseReferenceCount(assetbundleName); return(loader); }
public IEnumerator Initialize() { #if UNITY_EDITOR if (AssetBundleConfig.IsEditorMode) { yield break; } #endif manifest = new Manifest(); assetsPathMapping = new AssetsPathMapping(); // 说明:同时请求资源可以提高加载速度 var manifestRequest = RequestAssetBundleAsync(manifest.AssetbundleName); var pathMapRequest = RequestAssetBundleAsync(assetsPathMapping.AssetbundleName); yield return manifestRequest; var assetbundle = manifestRequest.assetbundle; manifest.LoadFromAssetbundle(assetbundle); assetbundle.Unload(false); manifestRequest.Dispose(); yield return pathMapRequest; assetbundle = pathMapRequest.assetbundle; var mapContent = assetbundle.LoadAsset<TextAsset>(assetsPathMapping.AssetName); if (mapContent != null) { assetsPathMapping.Initialize(mapContent.text); } assetbundle.Unload(true); pathMapRequest.Dispose(); // 设置所有公共包为常驻包 var start = DateTime.Now; var allAssetbundleNames = manifest.GetAllAssetBundleNames(); foreach (var curAssetbundleName in allAssetbundleNames) { if (string.IsNullOrEmpty(curAssetbundleName)) { continue; } int count = 0; foreach (var checkAssetbundle in allAssetbundleNames) { if (checkAssetbundle == curAssetbundleName || string.IsNullOrEmpty(checkAssetbundle)) { continue; } var allDependencies = manifest.GetAllDependencies(checkAssetbundle); if (Array.IndexOf(allDependencies, curAssetbundleName) >= 0) { count++; if (count >= 2) { break; } } } // 说明:设置被依赖数量为1的AB包为常驻包的理由详细情况见AssetBundleAsyncLoader.cs那一大堆注释 // TODO:1)目前已知Unity5.3版本和Unity5.5版本没问题,其它试过的几个版本都有问题,如果你使用的版本也有问题,需要修改这里的宏 // 2)整套AB包括压缩格式可能都要重新设计,这个以后有时间再去尝试 #if !UNITY_5_3 && !UNITY_5_5 if (count >= 1) #else if (count >= 2) #endif { SetAssetBundleResident(curAssetbundleName, true); } } Logger.Log(string.Format("AssetBundleResident Initialize use {0}ms", (DateTime.Now - start).Milliseconds)); IsInitialized = true; yield break; }
public IEnumerator Initialize() { #if UNITY_EDITOR if (AssetBundleConfig.IsEditorMode) { yield break; } #endif manifest = new Manifest(); assetsPathMapping = new AssetsPathMapping(); // 说明:同时请求资源可以提高加载速度 var manifestRequest = RequestAssetBundleAsync(manifest.AssetbundleName); var pathMapRequest = RequestAssetBundleAsync(assetsPathMapping.AssetbundleName); yield return(manifestRequest); var assetbundle = manifestRequest.assetbundle; manifest.LoadFromAssetbundle(assetbundle); assetbundle.Unload(false); manifestRequest.Dispose(); yield return(pathMapRequest); assetbundle = pathMapRequest.assetbundle; var mapContent = assetbundle.LoadAsset <TextAsset>(assetsPathMapping.AssetName); if (mapContent != null) { assetsPathMapping.Initialize(mapContent.text); } assetbundle.Unload(true); pathMapRequest.Dispose(); // 设置所有公共包为常驻包 var start = DateTime.Now; var allAssetbundleNames = manifest.GetAllAssetBundleNames(); foreach (var curAssetbundleName in allAssetbundleNames) { if (string.IsNullOrEmpty(curAssetbundleName)) { continue; } int count = 0; foreach (var checkAssetbundle in allAssetbundleNames) { if (checkAssetbundle == curAssetbundleName || string.IsNullOrEmpty(checkAssetbundle)) { continue; } var allDependencies = manifest.GetAllDependencies(checkAssetbundle); if (Array.IndexOf(allDependencies, curAssetbundleName) >= 0) { count++; if (count >= 2) { break; } } } if (count >= 2) { SetAssetBundleResident(curAssetbundleName, true); } } Logger.Log(string.Format("AssetBundleResident Initialize use {0}ms", (DateTime.Now - start).Milliseconds)); yield break; }