public Action loadBundleAndDependency(string bundleName, DelegateVoidAssetBundle userCallBack) { var id = _uuId++; List <Action> disposes = new List <Action>(); var bundleNameHash = getNameWithHash(bundleName); var allDeps = Manifest.GetAllDependencies(bundleNameHash); _id2UnloadedCnt.Add(id, allDeps.Length + 1); _id2CallBack.Add(id, userCallBack); disposes.Add(BundleMgr.Instance.loadBundleByNameHash(bundleNameHash, ab => { _id2AssetBundle.Add(id, ab); OnAbLoadDone(id); })); foreach (var dep in allDeps) { disposes.Add(BundleMgr.Instance.loadBundleByNameHash(dep, ab => { OnAbLoadDone(id); })); } return(() => { foreach (var dispose in disposes) { dispose(); } _id2UnloadedCnt.Remove(id); _id2AssetBundle.Remove(id); _id2CallBack.Remove(id); }); }
public Action loadBundleByNameHash(string bundleName, DelegateVoidAssetBundle userCallBack) { int id = ++_uuId; _uuIdSet.Add(id); //引用计数+1 if (_name2RefCnt.ContainsKey(bundleName)) { _name2RefCnt[bundleName]++; } else { _name2RefCnt.Add(bundleName, 1); } if (_name2AssetBundle.TryGetValue(bundleName, out var ab)) { log( $"loadBundle: {bundleName}, refCnt:{_name2RefCnt[bundleName]}, bundle is loaded, return to user"); userCallBack?.Invoke(ab); } else { if (_loadingBundles.Contains(bundleName)) { log( $"loadBundle: {bundleName}, refCnt:{_name2RefCnt[bundleName]}, bundle is loading already"); } else { log($"loadBundle: {bundleName}, refCnt:{_name2RefCnt[bundleName]}, start coroutine"); _name2OnLoadDone.Add(bundleName, null); _loadingBundles.Add(bundleName); StartCoroutine(LoadBundleCoroutine(bundleName)); } //设置监听 if (!_name2OnLoadDone.ContainsKey(bundleName)) { _name2OnLoadDone.Add(bundleName, null); } _name2OnLoadDone[bundleName] += userCallBack; } //返回dispose方法. 如果需要在userCallBack里释放,新加一个loadBundle方法,userCallBack的时候把dispose作为参数 return(() => { if (!_uuIdSet.Contains(id)) { Debug.LogWarning($"{bundleName} has been disposed already"); return; } _uuIdSet.Remove(id); _name2RefCnt[bundleName]--; _name2OnLoadDone[bundleName] -= userCallBack; if (_name2RefCnt[bundleName] == 0) { if (_name2AssetBundle.ContainsKey(bundleName)) { log($"release bundle: {bundleName}, refCnt:0, Unload bundle"); _name2AssetBundle[bundleName].Unload(true); _name2AssetBundle.Remove(bundleName); _name2RefCnt.Remove(bundleName); _name2OnLoadDone[bundleName] = null; _name2OnLoadDone.Remove(bundleName); } else { log($"release bundle: {bundleName}, refCnt:0,but it is still loading"); _name2OnLoadDone[bundleName] = null; _name2OnLoadDone.Remove(bundleName); _name2RefCnt.Remove(bundleName); } } else { log($"release bundle: {bundleName}, refCnt:{_name2RefCnt[bundleName]}"); } }); }
public Action loadBundleByPureName(string pureName, DelegateVoidAssetBundle userCallBack) { var name_hash = BundleDepMgr.Instance.getNameWithHash(pureName); return(loadBundleByNameHash(name_hash, userCallBack)); }