unity代码热更后异步代码有问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity代码热更后异步代码有问题相关的知识,希望对你有一定的参考价值。
参考技术A unity代码热更后异步代码是有问题。unity代码热更后会出现bug,产生的代码会出现错误,异步代码会产生问题。Unity资源热更-Addressables总结
Addressables是Unity官方推出的用于资源热更的系统,可在Package Manager里面下载,我这里分两部分讲解,第一部分是操作入门,第二部分是代码编程以及注意事项
一、入门
选择合适的Addressables版本下载安装完成后,选择Groups
点击Create Addressables Settings
它会默认给你创建一个本地的Group,选中这个Group,可以在Inspector面板看到如下图示:
这五个红框是我会经常设置的地方(从上到下):
1.点击之后会跳转到Settings面板,Settings面板等会讲
2.更新形式,一种是Can,一种是Cannot,这两种的更新操作会有些区别,Unity官方是建议将用作增量更新的AB包使用Cannot形式,比如有一些ab包是要放进App的包体里的,这时候我们一般第三个框会选择Local,也就是说这个Group下的资源会被打包成ab包然后在build app的时候,会复制到我们的StreamingAssets文件夹里,这样如果这些ab包里面有资源要更新,那么就可以操作将这些资源导出来放到一个新的Group里来进行热更(至于怎么操作,等会会在更新环节讲)
3.Local or Remote,如果是选择Remote的话,那么你还需要到Addressables Profiles里去设置你的远程资源地址,Remote.BuildPath我们通常不改,一般只改Remote.LoadPath,即使用你自己的资源服务器地址
4.这里我通常会勾上
5.Cache Clear Behavior:这里如果是Local的话我一般用默认第一个,如果是Remote的话,我通常会选择第二个,第二个意思就是如果有资源更新了,加载了新资源的时候就会把本地的旧资源删除掉,自测很好用,避免本地下载的旧资源堆积太多
Bundle Mode:我个人喜欢分开打包,这样的好处就是如果只是一个很小的资源需要热更,那么下载的时候就只需要下载这个小资源,不用下载很多不必要的资源,对用户体验会比较好
接下来是Addressables Settings面板:
这四个红框是我会修改的地方(从上到下):
1.通过设置不同的Profiles,我们可以管理不同资源服务器的下载,比如内网、审核服、外网等等
2.Disable Catalog Update on Startup:这个勾选的话是说这个catalog不要在应用启动的时候就自动更新,等我们到了主界面,点击屏幕再更新,看看是否有更新,这个catalog保存的就是我们的资源信息,一般要做这种需要玩家确认下载的时候我会勾选这个,我也尝试过不勾选然后做无感更新也是可以的,即在App运行过程中有资源更新了,不需要退出再重新打开App或者返回主界面再更新,可以直接后台更新,然后再加载这个资源就是最新的资源了
3.这个我通常会勾选,如果是想加载远程的资源,path选Remote,如果是只想加载local group里的资源(即放在StreamingAssets),没有加载远程资源的需求,选择Local即可
4.初始化Objects,这里我通常会右键Create一个Cache Initialization Settings,改好之后放到这里面
然后就是Cache Directory Override这一栏填上UnityEngine.Application.persistentDataPath,相信了解这个地址的同学知道它的含义,简单来说这个地址就是用来热更的,这样可以方便我们管理资源,否则Addressables会将资源下载到另外一个缓存文件夹里
这些都设置好了之后,就是更新的操作了,接下来是一个示例:
我们先随便在场景里创建一个cube,然后让它变成一个prefab
再随手创建两个材质球,一个红色一个黄色,将红色材质球拖给Cube,通过改变这个cube的材质球来对它进行热更
1.勾选Build Remote Catalog,取消勾选Disable Catalog Update on Startup,取消之后这样每当我们重新打开App,调用Addressables.InstantiateAsync生成这个Cube的时候Addressables都会先检查catalog更新然后下载最新的Cube到本地,最终在场景里生成最新的Cube
2.将Cube拖到这个默认的Group下,然后单击或者右键选择下图简化名字,这个Name:"Cube"就是我们之后使用Addressables API加载Cube需要传入的参数名
3.Group设置里选择Remote,红框里使用你自己的资源服务器地址,在Addressables Profiles里设置
4.点击Build->New Build->Default Build Script,Unity会自动为我们将资源打出成ab包
5.在Assets同级的ServerData里面,可以找到打出来的ab包
大概有这些文件:
.hash文件内容是.json文件的md5 ,一般更新的时候都是先对比这个md5有没有发生改变,有再比对.json里面的内容,最终确定要下载的资源
然后将这些资源放到我们的资源服务器上
6.接着在工程的场景里随便创建一个GameObject,再随便创建一个脚本,在Start方法里只做一件事,那就是输入这行代码:
Addressables.InstantiateAsync("Cube");
这个方法会生成最新的Cube,编译好了build and run一个exe,你就能在场景里看到这个红色的Cube了
7.接下来我们把yellow材质球拖给Cube,如图
然后我们对这个黄色Cube打包
这里需要注意,当我们选择的更新形式是Can Change Post Release时,我们就采用上图的Update a Previous Build,然后选择你对应平台里的addressables_content_state.bin文件就可以打出新的ab包了
如果是Cannot,那我们就需要点击Tools->Check for Content Update Restrictions,它会生成一个新的Group,如下图:
再执行Update a Previous Build,然后选择你对应平台里的addressables_content_state.bin文件才可以打出新的ab包
8.我这里采用的是Can Change Post Release方式,再把这些资源都上传到资源服务器
重新打开exe,是不是变成了黄色了?到这里相信你们对这个操作流程就熟悉了,至于一些高阶的用法,我会在下一章详细讲解
以上是关于unity代码热更后异步代码有问题的主要内容,如果未能解决你的问题,请参考以下文章