예제 #1
0
        /// <summary>
        /// 此种方式只能加载需要预加载的依赖包
        /// </summary>
        /// <param name="bundleName"></param>
        /// <param name="completeCallback"></param>
        /// <param name="cacheTimeout"></param>
        public void LoadBundle(string bundleName, Action <string> completeCallback = null)
        {
            if (!CheckInited())
            {
                if (completeCallback != null)
                {
                    completeCallback("");
                }

                return;
            }

            var bundleLoader = new KTBundleLoader()
            {
                requestBundleName = bundleName,
                cacheType         = BundleCacheType.Share,
                request           = AssetBundle.LoadFromFileAsync(bundleName),
                completeCallback  = completeCallback
            };

            m_bundleLoading.Add(bundleName, bundleLoader);
            IncreaseRef(bundleName);
        }
예제 #2
0
        /// <summary>
        /// 处理m_assetLoading中加载完成的asset回调资源或尚未加载的bundle加入到m_bundleLoading中
        /// </summary>
        private void UpdateAssetLoader()
        {
            var namesToDeleteAsset = new List <string>();

            foreach (var item in m_assetLoading)
            {
                if (item.Value.loaderType == KTAssetLoader.LoaderType.Asset)
                {
                    if (item.Value.request == null)//尚未请求资源
                    {
                        var allBundleLoaded = IsBundleAvailable(item.Value.requestBundleName);
                        if (allBundleLoaded)
                        {
                            var bundleInfo = m_bundleLoaded[item.Value.requestBundleName];
                            item.Value.request           = bundleInfo.bundle.LoadAssetAsync(item.Value.requestAssetName);
                            item.Value.isAllBundleLoaded = allBundleLoaded;
                        }
                        else
                        {
                            if (item.Value.isAllBundleLoading)
                            {
                                continue;
                            }

                            //把没在loading中的KTBundleLoader加入到loading中
                            var toLoadBundles = item.Value.dependentBundleNames.Where(name =>
                            {
                                return(!m_bundleLoaded.ContainsKey(name) && !m_bundleLoading.ContainsKey(name));//保证不会被正在加载的bundleLoader覆盖cacheType
                            });

                            toLoadBundles.ToList().ForEach(name =>
                            {
                                var bundleLoader = new KTBundleLoader()
                                {
                                    requestBundleName = item.Value.requestBundleName,
                                    cacheType         = item.Value.cacheType,
                                    cacheTimeout      = item.Value.cacheTimeout,
                                    request           = AssetBundle.LoadFromFileAsync(item.Value.requestBundleName)
                                };

                                m_bundleLoading.Add(item.Value.requestBundleName, bundleLoader);
                                AddAssetWaitingBundle(item.Key, item.Value.requestBundleName);
                            });

                            item.Value.isAllBundleLoading = true;
                            continue;
                        }
                    }

                    if (item.Value.request.isDone)
                    {
                        //相关依赖包增加引用计数
                        item.Value.dependentBundleNames.ForEach(bundleName =>
                        {
                            m_bundleLoaded[bundleName].refCount++;
                        });

                        m_assetNameToWeakPtr.Add(item.Key, new WeakReference(item.Value.request.asset));

                        //回调所有请求
                        item.Value.completeCallbackList.ForEach(callback =>
                        {
                            callback(item.Key, item.Value.request.asset);
                            namesToDeleteAsset.Add(item.Key);
                        });

                        //根据情况销毁已加载的请求的bundle,不过如果存在不同的资源都使用了同一个bundle的情况,要在所有asset请求返回后再删除bundle,所以,需要延后处理
                    }
                }
                else if (item.Value.loaderType == KTAssetLoader.LoaderType.Scene)
                {
                    if (item.Value.sceneRequest == null)//尚未请求资源
                    {
                        var allBundleLoaded = IsBundleAvailable(item.Value.requestBundleName);
                        if (allBundleLoaded)
                        {
                            var bundleInfo = m_bundleLoaded[item.Value.requestBundleName];
                            item.Value.sceneRequest      = SceneManager.LoadSceneAsync(item.Value.requestAssetName, item.Value.loadMode);
                            item.Value.isAllBundleLoaded = allBundleLoaded;
                        }
                        else
                        {
                            if (item.Value.isAllBundleLoading)
                            {
                                continue;
                            }

                            //把没在loading中的KTBundleLoader加入到loading中
                            var toLoadBundles = item.Value.dependentBundleNames.Where(name =>
                            {
                                return(!m_bundleLoaded.ContainsKey(name) && !m_bundleLoading.ContainsKey(name));
                            });

                            toLoadBundles.ToList().ForEach(name =>
                            {
                                var bundleLoader = new KTBundleLoader()
                                {
                                    requestBundleName = item.Value.requestBundleName,
                                    cacheType         = item.Value.cacheType,
                                    cacheTimeout      = item.Value.cacheTimeout,
                                    request           = AssetBundle.LoadFromFileAsync(item.Value.requestBundleName)
                                };

                                m_bundleLoading.Add(item.Value.requestBundleName, bundleLoader);
                                AddAssetWaitingBundle(item.Key, item.Value.requestBundleName);    //不同场景可能会同时请求一个bundle,所以此处与加载其他asset一样
                            });

                            item.Value.isAllBundleLoading = true;
                            continue;
                        }
                    }

                    if (item.Value.sceneRequest.isDone)
                    {
                        //相关依赖包增加引用计数
                        item.Value.dependentBundleNames.ForEach(bundleName =>
                        {
                            m_bundleLoaded[bundleName].refCount++;
                        });

                        m_assetNameToWeakPtr.Add(item.Key, new WeakReference(item.Value.request.asset));

                        //回调所有请求
                        item.Value.sceneCompleteCallback(item.Key);
                        namesToDeleteAsset.Add(item.Key);
                        //根据情况销毁已加载的请求的bundle,不过如果存在不同的资源都使用了同一个bundle的情况,要在所有asset请求返回后再删除bundle,所以,需要延后处理
                    }
                }
            }

            //删除所有请求
            namesToDeleteAsset.ForEach(name =>
            {
                if (m_assetLoading.ContainsKey(name))
                {
                    //清除掉所有等待bundleLoader的assetLoader关系信息
                    var assetLoader = m_assetLoading[name];
                    assetLoader.dependentBundleNames.ForEach(bundleName => DelAssetWaitingBundle(bundleName));
                    m_assetLoading[name].Dispose();
                    m_assetLoading.Remove(name);
                }
            });
        }