14.资源打包加载-资源更新
14.1 知识点
资源更新指的是什么
当项目正式发布后,对于远程加载的资源我们可以通过改变资源服务器上的AB包内容来达到更新游戏的目的。Addressables会自动帮助我们判断哪些资源更新了,并加载最新的内容。
内容更新限制参数回顾
点击Group窗口的每一个组,在Inspect窗口组设置中有一个内容更新限制的设置:Content Update Restriction。
Can Change Post Release:
一个资源变了这个包重新打包,可以改变发行后内容,该模式不移动任何资源,如果包中的任何资源发生了更改,则重新构建整个包。就是一个资源变了会重新打整个包。Cannot Change Post Release:
一个资源变了把这个资源打成一个包,无法改变发布后内容。如果包中任何资源已经改变,则[检查内容更新限制]工具会将其移动到为更新创建的新组中。在进行更新构建时,从这个新组创建的AssetBundles中的资产将覆盖现有包中的版本。就是一个资源变了打一个新包。
整包更新
整包更新概述
组设置为 Can Change Post Release。
整包更新指,某一个分组的资源发生变化后,我们需要将其整体进行打包。
这种方式比较适用于大范围资源更新时使用。
坏处是,玩家需要下载的内容较大,比较耗时耗流量。
启动一个模拟服务器,或者使用hfs模拟http服务器
添加一个概述配置文件,修改成模拟服务器的端口号并设置成激活。
修改AddressableAssetSettings。Profile选择我们当前的Lesson14概述配置文件。勾选远端生成目录和改成远端路径,并选择成远端生成和加载目录。
把GameObject包设置成远端加载和构建,内容更新限制改为设置为 Can Change Post Release。
清除之前的AB包并把ServerData文件夹的内容删了,再重新打包。
进行远程包资源加载Cube,这个资源是从远程包加载的。直接运行的话可以加载Cube成功。
Addressables.LoadAssetsAsync<GameObject>(new List<string>() { "Cube", "SD" }, (obj) => { Instantiate(obj); },Addressables.MergeMode.Intersection);
把这个场景打包成应用程序,出来的应用程序中没有GameObject包,只有本地的其他包,但是也能加载出来。因为是从服务器加载的。
从这里开始我们要进行整包更新了
把一个胶囊体模型丢进来,名字和标签都改成和之前的一一模一样,相当于更新了资源模型,把之前的Cube删了。就是虽然都叫Cube,标签也一样,但是模型变了。
点击更新构建,并选择addresables_content_state文件,这个文件是记录上一次打包的资源信息目录,会进行对比。
更改完查看ServeData文件夹,可以看到有两个GameObject包,一个是刚刚因为我们点击了更新操作打出来的。
注意:Unity自带的资源服务器模拟工具有问题,有的时候明明开启了服务但是加载不成功。可能是Win11系统造成的。所以我们得推到重来。这是Unity的坑。
我们干脆就使用第三方工具来搭建我们的模拟本地资源服务器,ip地址和端口号调整成一致即可。并且把最新的ServeData文件夹中的内容上传到服务器。假如是从服务器加载AB包的话服务器会有Log。
有时候更新加载ip地址和端口号会遇到编辑器更新不及时的问题,还是会找以前的端口号和ip地址。可以尝试把profile删了重新创建设置,AddressableAssetSettings配置文件的远程路径和Group中的远程路径也多点几次刷新一下
现在无论是Unity中还是应用程序运行运行后加载的会生成的都会是胶囊体。注意:我们没有重新生成应用程序,应用程序打出来后也没有做任何更新,只更新了服务器上的AB包。实现热更新。
局部更新
局部更新概述
组设置为 Cannot Change Post Release。
局部更新指,当组中有资源发生变化时,我们可以单独为发生变化的内容生成AB包。之后使用该资源时,Addressables会自动加载最新的内容。它相对整包更新来说,更节约时间和流量。
选择GameObject包,把内容更新限制改为设置为 Cannot Change Post Release。
把一个圆柱体模型丢进来,名字和标签都改成和之前的一一模一样,相当于更新了资源模型。点击工具,检查更新限制,并选择addresables_content_state文件。
弹出要更新的资源窗口,因为我们是从整包更新切换成局部更新,会认为我们整个包都有变化。我们选择圆柱体和其他的,胶囊体不选择,点击应用修改按钮。
应用的资源会跑到更新组中。
和整体更新一样,点击更新构建,并选择addresables_content_state文件,这个文件是记录资源信息目录。
对比前后的远程服务器的包会发现,多了个GameObject包,因为这个包内容我们重新构建了,还多了个content更新组的包,这是因为我们选择局部更新,目录文件也重新生成了,只是名字没有变。把这些包上传到服务器。
现在无论是Unity中还是应用程序运行运行后加载的会生成的都会是圆柱体。注意:我们应用程序打出来后没有做任何更新,只更新了服务器上的AB包。
总结
远程资源包时整包更新还是局部更新取决于Content Update Restriction内容更新限制参数。可以根据自己项目的实际情况选择具体使用哪种方式即可。
一定记住,更新当前版本的小内容都是通过更新以前版本来生成AB包,而不是重新打包构建。如果要重新打包构建了,那就必须重新发布一次应用程序(PC:exe)。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com