/// <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); }
/// <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); } }); }