Addressable(二):从远程下载

2023-10-17 04:30
文章标签 远程 下载 addressable

本文主要是介绍Addressable(二):从远程下载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Local和Rmote区别

刚刚第一篇有讲到,点击分组标签,在Inspector可以看到AB包将会打到什么位置和从什么位置加载。本地的话,打包出来AB会在APK包里,远程的不会。从APK加载远程的会从服务器下载。

在这里插入图片描述

开启远程的:找到Addressable Asset Settings文件,Build&Load Paths选择Remote.
并且这里的Disable Catalog Update On Startup我们勾选上,主要是我们后面代码自己控制要更新那些文件。

远程的下载到本地后会进行缓存,以后就会每次先从缓存中读取。如果删除了缓存,又会从服务器中读取。
注意:如果Remote类型关闭了下图该选项,不会缓存到本地,而是每次都从服务器下载。
在这里插入图片描述

Can Change Post Release和Cannot Change Post区别

可以看到在上图的Content Update Restriction里面还有一个Update Restriction(更新限制)选项,可以选中以下两种:
Can Change Post Release:
后续更新资源的话全量更新(直接替换旧资源)
Cannot Change Post Release:
后续更新资源的话增量更新(不改变旧资源包,使用新资源包加载改变的内容)

这两种的区别可以在下面的更新AB包的步骤看出区别。

更新AB包

假如我们现在已经有一个APK包发出去了,AB包的类型既有Local,又有Remote;既有Can Chage又有Cannot Change类型。那么APK将会从那些地方加载这些AB包呢?前面已经说过Local将会打进APK里,那么会放在本地,Remote将会放在远程服务器,使用时候将会从远程服务器下载下来,并提供是否缓存选项。

那么现在更新AB包,我们将怎么做呢?

  1. 选择Tool-Check for Content Update Restrictions
    在这里插入图片描述

点击后会弹出对话框要求选择之前打包生成的.bin文件.然后会出现如下界面
在这里插入图片描述
注意:这里会将Asset有改变的,并且分组选项是Cannot Change Post Release的包(将要增量更新的包),选择出来,然后点击右下角的apply change,就会有一个新的分组ContentUpdate出现,这个分组的包将会打在Remote,然后放在服务器,就能更新原来不论在Local,还是Remote的Cannot Change包。

而Can Change的包将会直接生成新的Bundle,到时候旧的APK更新Catalog后,就能从新的Bundle里去读到资源。
在这里插入图片描述

  1. 选择Build-Clean Build,把旧的本地资源包清除,再把ServerData的服务器资源包清除,再选中Update a Previous Build,同样要选择之前打包生成的.bin文件,这时候就打成了新的AB包。
    在这里插入图片描述

加载AB包

这里直接上代码,先检查有哪些要更新的。

 private List<object> _updateKeys = new List<object>();private async void UpdateCatalog(){//初始化Addressablevar init = Addressables.InitializeAsync();await init.Task;//开始连接服务器检查更新var handle = Addressables.CheckForCatalogUpdates(false);await handle.Task;Debug.Log("check catalog status " + handle.Status);if (handle.Status == AsyncOperationStatus.Succeeded){List<string> catalogs = handle.Result;if (catalogs != null && catalogs.Count > 0){foreach (var catalog in catalogs){Debug.Log("catalog  " + catalog);}Debug.Log("download catalog start ");var updateHandle = Addressables.UpdateCatalogs(catalogs, false);await updateHandle.Task;foreach (var item in updateHandle.Result){Debug.Log("catalog result " + item.LocatorId);foreach (var key in item.Keys){Debug.Log("catalog key " + key);}_updateKeys.AddRange(item.Keys);}Debug.Log("download catalog finish " + updateHandle.Status);}else{Debug.Log("dont need update catalogs");}}Addressables.Release(handle);}

然后下载新的AB包:

 public void DownLoad(){StartCoroutine(DownAssetImpl());}public IEnumerator DownAssetImpl(){var downloadsize = Addressables.GetDownloadSizeAsync(_updateKeys);yield return downloadsize;Debug.Log("start download size :" + downloadsize.Result);if (downloadsize.Result > 0){var download = Addressables.DownloadDependenciesAsync(_updateKeys, Addressables.MergeMode.Union);yield return download;//await download.Task;Debug.Log("download result type " + download.Result.GetType());foreach (var item in download.Result as List<UnityEngine.ResourceManagement.ResourceProviders.IAssetBundleResource>){var ab = item.GetAssetBundle();Debug.Log("ab name " + ab.name);foreach (var name in ab.GetAllAssetNames()){Debug.Log("asset name " + name);}}Addressables.Release(download);}Addressables.Release(downloadsize);}

原来AB包在Remote的是都能正常更新的,原来Local的并且Cannot Change(能增量更新的)也在刚刚打包过程中可以看到新生成了ContentUpdate分组的,并且放在了Remote。能够进行更新。
只有Local的并且Can Chage的旧包无法更新,只有新包才能正常加载。

示例

新建了四个预制体,放在四个Group里面:
LocalStatic: 本地的,Cannot Change Post Release的
LocalNoStatic:本地的,Can Change Post Release的
RemoteStatic:远程的,Cannot Change Post Release的
RemoteStatic:远程的,Can Change Post Release的
在这里插入图片描述

打出AB来,可以看到本地的AB:
在这里插入图片描述

远程的AB:
这里会有一个catalog的hast和json文件
在这里插入图片描述

然后在ServerData里面直接放了一个NetBox2,启动这个应用程序我们就能直接在本机访问localhost.。在这里插入图片描述
这里为了方便,直接打出一个Window平台的应用程序,可以看到,四个Prefab都加载出来了。
在这里插入图片描述

为了证明Remote分组的是从服务器加载下载的,把NexBox2关闭掉,并清除缓存(第一次下载下来并缓存到本地)。发现Remote的Prefab无法加载出来。
在这里插入图片描述

更新AB:
这里我对四个Prefab的高度都缩小一般,然后按照上面的更新AB包的方法,更新一遍AB包。

然后对刚刚的旧包进行操作,先UpdateCatalog,再DownLoad AB.
再次加载四个Prefab:
在这里插入图片描述
可以看到四个Prefab都发生了改变,只有LocalNoStatic这种没有发生改变。在前面也解释了,Local类型的,Can Change Post Release的更新AB后,并没有生成在contentupdate组里,而旧的路径,变成了新的catalog里面的路径,所以这个Prefab就丢了。

local non static 的Group是无法被AA系统更新的,万一不小心改到了这个Group了,并且使用了Update a Previous Build,那客户端会莫名其妙无法加载资源,所以强烈反对使用这种Group.官方文档上也忽略了这种Group.

而如果打出新的包出来,四个Prefab都加载正常。
在这里插入图片描述

示例工程:
https://download.csdn.net/download/KindSuper_liu/81588390

参考:
https://blog.csdn.net/qq_14903317/article/details/108529590#comments_20052993

这篇关于Addressable(二):从远程下载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/222952

相关文章

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

Python下载Pandas包的步骤

《Python下载Pandas包的步骤》:本文主要介绍Python下载Pandas包的步骤,在python中安装pandas库,我采取的方法是用PIP的方法在Python目标位置进行安装,本文给大... 目录安装步骤1、首先找到我们安装python的目录2、使用命令行到Python安装目录下3、我们回到Py

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

Python如何快速下载依赖

《Python如何快速下载依赖》本文介绍了四种在Python中快速下载依赖的方法,包括使用国内镜像源、开启pip并发下载功能、使用pipreqs批量下载项目依赖以及使用conda管理依赖,通过这些方法... 目录python快速下载依赖1. 使用国内镜像源临时使用镜像源永久配置镜像源2. 使用 pip 的并

jdk21下载、安装详细教程(Windows、Linux、macOS)

《jdk21下载、安装详细教程(Windows、Linux、macOS)》本文介绍了OpenJDK21的下载地址和安装步骤,包括Windows、Linux和macOS平台,下载后解压并设置环境变量,最... 目录1、官网2、下载openjdk3、安装4、验证1、官网官网地址:OpenJDK下载地址:Ar