private void OnRelease() { if (RefCount > 0) { RefCount--; if (RefCount <= 0) { //停止对这个AB的请求 ABRequest.StopRequest(ABName); //停止这个对这个AB中资源的请求 AssetRequest.StopRequest(ABName); //缓存列表中移除 if (mResMap.ContainsKey(ResName)) { mResMap.Remove(ResName); } //释放这个AB的所有资源,从这个AB中加载的资源Asset都将变为"null" if (AB != null) { AB.Unload(true); AB = null; } } } }
protected override IEnumerator CoLoad(bool isSync, bool isAll, bool isPreLoad, Action <AssetLoadData> callback) { ABRequest.Load(this, isSync, AssetType); while (!ABRequest.IsComplete) { yield return(null); } OnCompleted(null, isPreLoad, callback); }
protected virtual IEnumerator CoLoad(bool isSync, bool isAll, bool isPreLoad, Action <AssetLoadData> callback) { ABDep = Get <HAssetBundle>(ABName, "", AssetType.eAB); //加载AB ABRequest.Load(ABDep, isSync, AssetType); while (!ABRequest.IsComplete) { yield return(null); } //加载Asset AssetRequest.Load(ABDep.AB, AssetName, isSync, isAll); while (!AssetRequest.IsComplete) { yield return(null); } //回调 OnCompleted(AssetRequest, isPreLoad, callback); }
public void ReleaseAll() { List <HRes> resList = new List <HRes>(); foreach (var item in HRes.mResMap) { resList.Add(item.Value); } //停止掉正在加载的AB ABRequest.StopAllRequest(); //停止掉正在加载的AB中的资源 AssetRequest.StopAllRequest(); //释放AB资源 for (int i = 0; i < resList.Count; i++) { resList[i].ReleaseAll(); } HAssetBundle.ReleaseAssetBundleManifest(); }
//真正地加载资源 private void InnerLoadAssetBundle() { ABRequest abRequest = m_LoadList[0]; string name = abRequest.name; Type type = abRequest.type; Action <object> callback = abRequest.callback; Action <string> errorback = abRequest.errorback; name = name + GameConfig.AssetTail; //eg:ui/panel.unity3d Action <List <AssetBundle> > action = (depenceAssetBundles) => { string realName = GameConfig.GetPlatformPath(name); //eg:Windows/ui/panel.unity3d string path = GameConfig.GetWWWReadPath(realName, false); LoadRes(path, (www) => { if (www.error != null) { errorback(www.error); return; } int index = realName.LastIndexOf("/"); string assetName = realName.Substring(index + 1); assetName = assetName.Replace(GameConfig.AssetTail, ""); AssetBundle assetBundle = www.assetBundle; UnityEngine.Object obj = assetBundle.LoadAsset(assetName, type); //LoadAsset(name),这个name没有后缀,eg:panel //卸载资源内存 assetBundle.Unload(false); foreach (AssetBundle depenceAssetBundle in depenceAssetBundles) { depenceAssetBundle.Unload(false); } //加载目标资源完成的回调 callback(obj); }); }; LoadDependenceAssets(name, action, errorback); }
public HRes() { ABRequest = new ABRequest(); AssetRequest = new AssetRequest(); AssetData = new AssetLoadData(); }