Пример #1
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]}");
                }
            });
        }