//开始异步加载Resources类型的资源,用来模拟AssetBundle异步加载流程 private static IEnumerator BeginResourceLoadAsync(ResourceItem item) { var request = Resources.LoadAsync(item.Path); yield return request; var asset = request.asset; if (asset == null) { var assets = Resources.LoadAll(item.Path); if (assets == null || assets.Length == 0) { Debug.LogError("资源不存在:\n路径:" + item.Path); item.LaunchCallBack(); yield break; } else item.SetAssets(assets); } else item.SetMainAsset(asset); //Debug.LogError("load: "+asset); //if (item.NeedCRC) //{ // item.CRC = FirstUtil.CRC32String(File.ReadAllBytes(string.Concat( Application.dataPath, "/Resources/", item.Path, ".prefab"))); //} item.SetLoadState(EResItemLoadState.Completed); //按需清除ResourceItem缓存 if (item.IsClearAfterLoaded && m_resourceItemDic.ContainsKey(item.Path)) m_resourceItemDic.Remove(item.Path); item.LaunchCallBack(); }
//开始异步加载AssetBundle类型的资源 //远程下载文件到内存中成为AssetBundle镜像,再开辟内存从AssetBundle镜像中创建出指定Asset,最后卸载掉AB镜像内存,只保留Asset对象 private static IEnumerator BeginAssetBundleLoadAsync(ResourceItem item) { var isMainifest = IsManifest(item.Path); var path = AssetPathConfig.GetAssetPathWWW(!isMainifest ? item.Path.ToLower() : item.Path); item.SetLoadState(EResItemLoadState.Loading); //if (item.Path.Contains("atlas")) LoggerHelper.Error("begin atlas path: " + item.Path); var www = new WWW(path); yield return www; if (string.IsNullOrEmpty(www.error)) { item.SetLoadState(EResItemLoadState.Completed); //Debug.LogError("load success, path: " + www.url); if (!item.IsSaveAssetBundle || !IsSaveBundle(item.Path)) { Object mainAsset = null; var bundle = www.assetBundle; if (isMainifest) { //LoggerHelper.Error("is mainifest: " + item.Path); mainAsset = bundle.LoadAsset("AssetBundleManifest"); item.SetMainAsset(mainAsset); } else { mainAsset = bundle.mainAsset; if (mainAsset == null) { var assets = bundle.LoadAllAssets(); if (assets == null || assets.Length == 0) { Debug.LogError("load no assets, path: " + item.Path); yield break; } mainAsset = assets[0]; item.SetMainAsset(mainAsset); item.SetAssets(assets); } } item.LaunchCallBack(); if (bundle != null) bundle.Unload(false); www.Dispose(); } else { item.SetAssetBundle(www.assetBundle); //if (item.Path.StartsWith("atlas")) LoggerHelper.Error("after atlas path: " + item.Path); item.LaunchCallBack(); www.Dispose(); } } else { item.SetLoadState(EResItemLoadState.Error); Debug.LogError(string.Format("加载资源失败:{0}\n{1}", www.url, www.error)); item.LaunchCallBack(); } //按需清除ResourceItem缓存 if (item.IsClearAfterLoaded) { Clear(item.Path); GarbageCollect(); } }