需要扩展两个方法出来,一个是修改请求catalog的地址,一个是获取Bundle的大小接口
//Addressables.cs public static void SetRemoteCatalogLocation(string newLocation) { m_Addressables.SetRemoteCatalogLocation(newLocation); } public static long GetResourceLocationSize(IResourceLocation location) { return m_Addressables.GetResourceLocationSize(location); } //AddressablesImpl.cs public void SetRemoteCatalogLocation(string location) { for (var i = 0; i < m_ResourceLocators.Count; i++) { if (m_ResourceLocators[i].CanUpdateContent) { var locationInfo = m_ResourceLocators[i] as ResourceLocatorInfo; if (locationInfo.HashLocation != null) { locationInfo.HashLocation.InternalId = location; } } } } public long GetResourceLocationSize(IResourceLocation location) { long size = 0; var sizeData = location.Data as ILocationSizeData; if (sizeData != null) size = sizeData.ComputeSize(location, ResourceManager); return size; }
更新流程:
设置加载资源的远程路径,catalog和Bundle
检查网络资源表catalog
下载网络资源表catalog
通过全局资源lable后去所有的ResourceLocation
自定义辨别筛选出需要更新Bundle资源的ResourceLocation
获取下载的大小
更新下载
//初始化内置Bundle包列表 AssetBundleManager.cs public void Init() { #if !UNITY_EDITOR var json = Resources.Load<TextAsset>("Version/BuildInBundleName"); buildInData = JsonUtility.FromJson<BuildInBundleData>(json.text); #endif } //AddressableManager.cs //1.设置远程加载地址 public void SetAddressableRemoteResCdnUrl(string remoteUrl) { Debug.Log("SetAddressableRemoteUrl remoteUrl = " + remoteUrl); if (string.IsNullOrEmpty(remoteUrl)) { return; } //设置catalog的请求路径 string newLocation = remoteUrl + "/" + "catalog_999.hash";//后缀对应为AddressableAssetSettings的PlayerVersionOverried Addressables.SetRemoteCatalogLocation(newLocation); //设置location的transfrom func Addressables.InternalIdTransformFunc = (IResourceLocation location) => { string internalId = location.InternalId; if (internalId != null && internalId.StartsWith("http")) { var fileName = Path.GetFileName(internalId); string newInternalId = remoteUrl + "/" + fileName; return newInternalId; } else { return location.InternalId; } }; } //2.检查网络资源表 public OperationData CheckForCatalogUpdates() { var aOperation = Addressables.CheckForCatalogUpdates(false); return OperationData.Get(aOperation); } //3.下载对应资源表 public OperationData UpdateCatalogs(List<string> catlogs) { var aOperation = Addressables.UpdateCatalogs(catlogs,false); return OperationData.Get(aOperation); } //4.通过全局lable获取所有的ResourceLocation public OperationData GetCheckContentList(string label) { CheckContentList.Clear(); var aOperation = Addressables.LoadResourceLocationsAsync(new List<string> { label }, Addressables.MergeMode.Union); return OperationData.Get(aOperation,false, OnGetCheckContentList); } //5.筛选出需要更新的内容 -1错误 0为没有更新 public int GetUpdateContentList() { if (CheckContentList == null) { Debug.LogError("获取所有的ResourceLocation为空"); return -1; } if (AssetBundleManager.GetInstance().buildInData == null) { #if !UNITY_EDITOR Debug.LogError("获取内置Bundle配置为空"); return -1; #else return 0; #endif } IList<IResourceLocation> updateContent = new List<IResourceLocation>(); foreach (var item in CheckContentList) { string bundleName; if (item.HasDependencies) { foreach (var dep in item.Dependencies) { bundleName = Path.GetFileName(dep.InternalId); if (AssetBundleManager.GetInstance().buildInData.BuildInBundleNames.Contains(bundleName)) { } else if (AssetBundleManager.GetInstance().IsCache(bundleName)) { } else { updateContent.Add(dep); } } } } CheckContentList = updateContent; return CheckContentList.Count; } //6.获取需要下载的大小 public long GetDownloadSize(string label) { long size = 0; foreach (IResourceLocation location in CheckContentList.Distinct()) { size += Addressables.GetResourceLocationSize(location); } return size; } //7.下载更新 public OperationData DownloadDependenciesAsync(string label) { var aOperation = Addressables.DownloadDependenciesAsync(CheckContentList); return OperationData.Get(aOperation); } public void OnGetCheckContentList(object list) { CheckContentList = list as IList<IResourceLocation>; }
OperationData为继承IEnumerator,提供异步等待