/// <summary> /// 卸载资源 /// </summary> /// <param name="_hasName"></param> private void UnloadAssetBundleAsync(string _hasName) { AssetBundleObject abObj = null; if (_loadedABList.ContainsKey(_hasName)) { abObj = _loadedABList[_hasName]; } else if (_loadingABList.ContainsKey(_hasName)) { abObj = _loadingABList[_hasName]; } else if (_readyABList.ContainsKey(_hasName)) { abObj = _readyABList[_hasName]; } if (abObj == null) { Debug.LogError("Unload Asset" + _hasName + "Fail"); } else { abObj.refCount--; foreach (var dpObj in abObj.depends) { UnloadAssetBundleAsync(dpObj.name); } if (abObj.refCount == 0) { _unloadABList.Add(_hasName, abObj); } } }
private void DoLoad(AssetBundleObject abObj) { //if (AssetsDownloadMgr.I.IsNeedDownload(GetFileName(abObj._hashName))) //{//这里是关联下载逻辑,可以实现异步下载再异步加载 // AssetsDownloadMgr.I.DownloadAsync(GetFileName(abObj._hashName), // () => // { // string path = GetAssetBundlePath(abObj._hashName); // abObj._request = AssetBundle.LoadFromFileAsync(path); // if (abObj._request == null) // { // string errormsg = string.Format("LoadAssetbundle path error ! assetName:{0}", abObj._hashName); // Debug.LogError(errormsg); // } // } // ); //} //else //{ // string path = GetAssetBundlePath(abObj._hashName); // abObj._request = AssetBundle.LoadFromFileAsync(path); // if (abObj._request == null) // { // string errormsg = string.Format("LoadAssetbundle path error ! assetName:{0}", abObj._hashName); // Debug.LogError(errormsg); // } //} }
/// <summary> /// /// </summary> /// <param name="bundleName">バンドル名</param> /// <param name="path">StreamingAssets/以下のフォルダパス</param> public void LoadBundle(string bundleName, string path = "") { //依存バンドルロード var dependencies = _manifest.GetAllDependencies(bundleName); foreach (var d in dependencies) { //bundleObjectListに含まれていたら取得 var dobj = _bundleObjectList.Find((b) => { return(b.BundleName == d); }); if (dobj == null) { //なければnewして生成 dobj = new AssetBundleObject(d, path); _bundleObjectList.Add(dobj); } StartCoroutine(dobj.LoadBundle()); } //本体バンドルロード var obj = _bundleObjectList.Find((b) => { return(b.BundleName == bundleName); }); if (obj == null) { obj = new AssetBundleObject(bundleName, path); _bundleObjectList.Add(obj); } StartCoroutine(obj.LoadBundle()); }
private void DoLoad(AssetBundleObject abObj) { string path = GetAssetBundlePath(abObj.name, abObj.bPublic); abObj.request = AssetBundle.LoadFromFileAsync(path); if (abObj.request == null) { string errormsg = string.Format("LoadAssetbundle path error ! assetName:{0}", abObj.name); Debug.LogError(errormsg); } }
private void DoUnload(AssetBundleObject abObj) { if (abObj.assetbundle != null) { abObj.assetbundle.Unload(true); abObj.assetbundle = null; } else { Debug.LogError("LoadAssetbundle DoUnload error !" + abObj.name); } }
/// <summary> /// 异步加载添加引用计数 /// </summary> /// <param name="abObj"></param> private void DoDependsRef(AssetBundleObject abObj) { abObj.refCount++; if (abObj.depends.Count == 0) { return; } foreach (var dps in abObj.depends) { DoDependsRef(dps); } }
private void DoUnload(AssetBundleObject abObj) { //这里用true,卸载Asset内存,实现指定卸载 if (abObj._ab == null) { string errormsg = string.Format("LoadAssetbundle DoUnload error ! assetName:{0}", abObj._hashName); Debug.LogError(errormsg); return; } abObj._ab.Unload(true); abObj._ab = null; }
private void DoDependsRef(AssetBundleObject abObj) { abObj._refCount++; if (abObj._depends.Count == 0) { return; } foreach (var dpObj in abObj._depends) { DoDependsRef(dpObj); //递归依赖项,加载完 } }
private void UnloadAssetBundleAsync(string _hashName) { AssetBundleObject abObj = null; if (_loadedABList.ContainsKey(_hashName)) { abObj = _loadedABList[_hashName]; } else if (_loadingABList.ContainsKey(_hashName)) { abObj = _loadingABList[_hashName]; } else if (_readyABList.ContainsKey(_hashName)) { abObj = _readyABList[_hashName]; } if (abObj == null) { string errormsg = string.Format("UnLoadAssetbundle error ! assetName:{0}", _hashName); Debug.LogError(errormsg); return; } if (abObj._refCount == 0) { string errormsg = string.Format("UnLoadAssetbundle refCount error ! assetName:{0}", _hashName); Debug.LogError(errormsg); return; } abObj._refCount--; foreach (var dpObj in abObj._depends) { UnloadAssetBundleAsync(dpObj._hashName); } if (abObj._refCount == 0) { _unloadABList.Add(abObj._hashName, abObj); } }
private void DoLoadedCallFun(AssetBundleObject abObj, bool bAsync = true) { if (abObj.request != null) { abObj.assetbundle = abObj.request.assetBundle; abObj.request = null; _loadingABList.Remove(abObj.name); _loadedABList.Add(abObj.name, abObj); } if (abObj.assetbundle == null) { ///这里可以添加下载 ///如果游戏太大,可以等玩家先下载游戏之后,剩余的资源等用到再下载 } foreach (var callback in abObj._callbacks) { callback(abObj.assetbundle); } abObj._callbacks.Clear(); }
/// <summary> /// 异步加载 /// </summary> /// <param name="_hasName"></param> /// <param name="callback"></param> /// <returns></returns> private AssetBundleObject LoadAssetBundleAsync(string _hasName, AssetBundleLoadCallback callback, bool bPublic = false) { AssetBundleObject abObj = null; if (_loadedABList.ContainsKey(_hasName)) //已经加载 { abObj = _loadedABList[_hasName]; DoDependsRef(abObj); callback(abObj.assetbundle); return(abObj); } else if (_loadingABList.ContainsKey(_hasName)) //正在加载 { abObj = _loadingABList[_hasName]; DoDependsRef(abObj); abObj._callbacks.Add(callback); return(abObj); } else if (_readyABList.ContainsKey(_hasName)) { abObj = _readyABList[_hasName]; DoDependsRef(abObj); abObj._callbacks.Add(callback); return(abObj); } abObj = new AssetBundleObject(); abObj.name = _hasName; abObj.bPublic = bPublic; abObj.refCount = 1; abObj._callbacks.Add(callback); ///先加载依赖项 ///这里设置一个约定 ///公共资源的依赖项必须放在公共资源文件夹中 ///即不能放在CNS,EN等文件夹中 string[] dependsData = null; if (_dependsDataList.ContainsKey(_hasName)) { Debug.Log("加载物体的名字" + _hasName); dependsData = _dependsDataList[_hasName]; foreach (string name in dependsData) { Debug.Log(name); } } if (dependsData != null && dependsData.Length > 0) { abObj._dependLoadingCount = dependsData.Length; //依赖依次加载 foreach (var dpName in dependsData) { AssetBundleObject dpObj = LoadAssetBundleAsync(dpName, (ab) => { if (abObj._dependLoadingCount <= 0) { Debug.LogError("LoadAssetBundle: " + _hasName + " depends error"); } else { abObj._dependLoadingCount--; //依赖加载完成,回调 if (abObj._dependLoadingCount == 0 && abObj.request != null && abObj.request.isDone) { DoLoadedCallFun(abObj); } } }, bPublic); abObj.depends.Add(dpObj); } } if (_loadingABList.Count < MAX_LOADING_NUM) { DoLoad(abObj); _loadingABList.Add(_hasName, abObj); } else { _readyABList.Add(_hasName, abObj); } return(abObj); }
/// <summary> /// 同步加载 /// </summary> /// <param name="_hasName"></param> /// <returns></returns> private AssetBundleObject LoadAssetBundleSync(string _hasName, bool bPublic = false) { AssetBundleObject abObj = null; if (_loadedABList.ContainsKey(_hasName)) //已经加载了 { abObj = _loadedABList[_hasName]; abObj.refCount++; foreach (var dpObj in abObj.depends) { LoadAssetBundleSync(dpObj.name); } return(abObj); } else if (_loadingABList.ContainsKey(_hasName)) //正在加载中 { abObj = _loadingABList[_hasName]; abObj.refCount++; foreach (var dpObj in abObj.depends) { LoadAssetBundleSync(dpObj.name); } DoLoadedCallFun(abObj, false); return(abObj); } else if (_readyABList.ContainsKey(_hasName)) //在准备加载中 { abObj = _readyABList[_hasName]; abObj.refCount++; foreach (var dpObj in abObj.depends) { LoadAssetBundleSync(dpObj.name); } string abPath = GetAssetBundlePath(_hasName, bPublic); abObj.assetbundle = AssetBundle.LoadFromFile(abPath); _readyABList.Remove(abObj.name); _loadedABList.Add(abObj.name, abObj); DoLoadedCallFun(abObj, false); return(abObj); } abObj = new AssetBundleObject(); abObj.name = _hasName; abObj.bPublic = bPublic; abObj.refCount = 1; string path = GetAssetBundlePath(_hasName, bPublic); abObj.assetbundle = AssetBundle.LoadFromFile(path); if (abObj.assetbundle == null) { Debug.LogError(path + "不存在"); return(null); } string[] dependData = null; if (_dependsDataList.ContainsKey(_hasName)) { dependData = _dependsDataList[_hasName]; } if (dependData != null && dependData.Length > 0) { abObj._dependLoadingCount = 0; foreach (var dpAssetName in dependData) { var dpObj = LoadAssetBundleSync(dpAssetName); abObj.depends.Add(dpObj); } } _loadedABList.Add(abObj.name, abObj); return(abObj); }
private void DoLoadedCallFun(AssetBundleObject abObj, bool isAsync = true) { //提取ab if (abObj._request != null) { abObj._ab = abObj._request.assetBundle; //如果没加载完,会异步转同步 abObj._request = null; _loadingABList.Remove(abObj._hashName); _loadedABList.Add(abObj._hashName, abObj); } if (abObj._ab == null) { string errormsg = string.Format("LoadAssetbundle _ab null error ! assetName:{0}", abObj._hashName); string path = GetAssetBundlePath(abObj._hashName); errormsg += "\n File " + File.Exists(path) + " Exists " + path; try {//尝试读取二进制解决 if (File.Exists(path)) { byte[] bytes = File.ReadAllBytes(path); if (bytes != null && bytes.Length != 0) { abObj._ab = AssetBundle.LoadFromMemory(bytes); } } } catch (Exception ex) { Debug.LogError("LoadAssetbundle ReadAllBytes Error " + ex.Message); } if (abObj._ab == null) { //同步下载解决 //byte[] bytes = AssetsDownloadMgr.I.DownloadSync(GetFileName(abObj._hashName)); byte[] bytes = new byte[4]; if (bytes != null && bytes.Length != 0) { abObj._ab = AssetBundle.LoadFromMemory(bytes); } if (abObj._ab == null) {//同步下载还不能解决,移除 if (_loadedABList.ContainsKey(abObj._hashName)) { _loadedABList.Remove(abObj._hashName); } else if (_loadingABList.ContainsKey(abObj._hashName)) { _loadingABList.Remove(abObj._hashName); } Debug.LogError(errormsg); if (isAsync) {//异步下载解决 //AssetsDownloadMgr.I.AddDownloadSetFlag(GetFileName(abObj._hashName)); } } } } //运行回调 foreach (var callback in abObj._callFunList) { callback(abObj._ab); } abObj._callFunList.Clear(); }
private AssetBundleObject LoadAssetBundleAsync(string _hashName, AssetBundleLoadCallBack _callFun) { AssetBundleObject abObj = null; if (_loadedABList.ContainsKey(_hashName)) //已经加载 { abObj = _loadedABList[_hashName]; DoDependsRef(abObj); _callFun(abObj._ab); return(abObj); } else if (_loadingABList.ContainsKey(_hashName)) //在加载中 { abObj = _loadingABList[_hashName]; DoDependsRef(abObj); abObj._callFunList.Add(_callFun); return(abObj); } else if (_readyABList.ContainsKey(_hashName)) //在准备加载中 { abObj = _readyABList[_hashName]; DoDependsRef(abObj); abObj._callFunList.Add(_callFun); return(abObj); } //创建一个加载 abObj = new AssetBundleObject(); abObj._hashName = _hashName; abObj._refCount = 1; abObj._callFunList.Add(_callFun); //加载依赖项 string[] dependsData = null; if (_dependsDataList.ContainsKey(_hashName)) { dependsData = _dependsDataList[_hashName]; } if (dependsData != null && dependsData.Length > 0) { abObj._dependLoadingCount = dependsData.Length; foreach (var dpAssetName in dependsData) { var dpObj = LoadAssetBundleAsync(dpAssetName, (AssetBundle _ab) => { if (abObj._dependLoadingCount <= 0) { string errormsg = string.Format("LoadAssetbundle depend error ! assetName:{0}", _hashName); Debug.LogError(errormsg); return; } abObj._dependLoadingCount--; //依赖加载完 if (abObj._dependLoadingCount == 0 && abObj._request != null && abObj._request.isDone) { DoLoadedCallFun(abObj); } } ); abObj._depends.Add(dpObj); } } if (_loadingABList.Count < MAX_LOADING_COUNT) //正在加载的数量不能超过上限 { DoLoad(abObj); _loadingABList.Add(_hashName, abObj); } else { _readyABList.Add(_hashName, abObj); } return(abObj); }
private AssetBundleObject LoadAssetBundleSync(string _hashName) { AssetBundleObject abObj = null; if (_loadedABList.ContainsKey(_hashName)) //已经加载 { abObj = _loadedABList[_hashName]; abObj._refCount++; foreach (var dpObj in abObj._depends) { LoadAssetBundleSync(dpObj._hashName); //递归依赖项,附加引用计数 } return(abObj); } else if (_loadingABList.ContainsKey(_hashName)) //在加载中,异步改同步 { abObj = _loadingABList[_hashName]; abObj._refCount++; foreach (var dpObj in abObj._depends) { LoadAssetBundleSync(dpObj._hashName); //递归依赖项,加载完 } DoLoadedCallFun(abObj, false); //强制完成,回调 return(abObj); } else if (_readyABList.ContainsKey(_hashName)) //在准备加载中 { abObj = _readyABList[_hashName]; abObj._refCount++; foreach (var dpObj in abObj._depends) { LoadAssetBundleSync(dpObj._hashName); //递归依赖项,加载完 } string path1 = GetAssetBundlePath(_hashName); abObj._ab = AssetBundle.LoadFromFile(path1); _readyABList.Remove(abObj._hashName); _loadedABList.Add(abObj._hashName, abObj); DoLoadedCallFun(abObj, false); //强制完成,回调 return(abObj); } //创建一个加载 abObj = new AssetBundleObject(); abObj._hashName = _hashName; abObj._refCount = 1; string path = GetAssetBundlePath(_hashName); abObj._ab = AssetBundle.LoadFromFile(path); if (abObj._ab == null) { try { //同步下载解决 //byte[] bytes = AssetsDownloadMgr.I.DownloadSync(GetFileName(abObj._hashName)); byte[] bytes = new byte[4]; if (bytes != null && bytes.Length != 0) { abObj._ab = AssetBundle.LoadFromMemory(bytes); } } catch (Exception ex) { Debug.LogError("LoadAssetBundleSync DownloadSync" + ex.Message); } } //加载依赖项 string[] dependsData = null; if (_dependsDataList.ContainsKey(_hashName)) { dependsData = _dependsDataList[_hashName]; } if (dependsData != null && dependsData.Length > 0) { abObj._dependLoadingCount = 0; foreach (var dpAssetName in dependsData) { var dpObj = LoadAssetBundleSync(dpAssetName); abObj._depends.Add(dpObj); } } _loadedABList.Add(abObj._hashName, abObj); return(abObj); }