Пример #1
0
        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);
            });
        }
Пример #2
0
        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]}");
                }
            });
        }
Пример #3
0
        public Action loadBundleByPureName(string pureName, DelegateVoidAssetBundle userCallBack)
        {
            var name_hash = BundleDepMgr.Instance.getNameWithHash(pureName);

            return(loadBundleByNameHash(name_hash, userCallBack));
        }