一小时极速掌握游戏资源远程热更新
版权声明
本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)

今天这篇文章一共分为两个部分,第一部分为游戏的远程热更新,第二部分为实现一个商业项目的资源热更新。


使用Addressable这个插件有什么好处呢?
大家知道我们在过去使用AssestBundle进行资源管理的时候,他的痛点很多。第一个是这个资源管理它采用一种叫做地址引用的方式。
第一点好处,解决了资源的重复引用问题。原来大家如果有过AssestBundle编程经验,大家就知道原来去用AssestBundle去管理一个资源。比如说有一个资源A,他引用了一个资源B,还引用了一个资源C的话。这个时候我要自己处理资源。在A进行加载之前,必须要把B和C给它加载进来。而如果我们使用Addressable这样一个插件,我们就不需要管理这些复杂性。他的地址的引用是很简单的,我只要指定我要加载的资源名A,然后他自动去把B和C给它加载进来。这个是我们使用Addressable的第一个好处.
第二点好处,自动资源引用计数机制。比如说我举个例子,还有一个好处就是资源的卸载,过去我们在使用AssestBundle进行资源管理的时候,资源卸载也是一个耗时耗力的过程。因为所有的资源卸载都需要你自己去负责。而现在我们使用AssestBundle,它自动在我们资源引用计数为零的时候,就自动把资源卸载掉。
第三点好处,完善的工具界面。大家使过过AssestBundle的同学都知道,我们使用AssestBundle的资源管理界面是需要自己去搭的。比如说我要管理某一个文件夹里面的资源,打包成一个资源包。如果我想通过可视化的方式去指定哪个文件夹打到哪个资源包。我要么编写代码没有界面,要么必须要找一些第三方的插件,要么必须自己写一个类似的编辑器扩展。它对我们开发者的要求还是比较高的,而使用我们的Addressable,它会有一个整合好的资源管理界面。

Addressable他的使用流程包括四个点。
首先第一步,我们需要创建一个资源分组。这个资源分组他就对应了过去你用AsssetBundle打出来的一个资源包,如果你没有学过AssestBundle也没有关系。你可以把它理解成一个资源组,默认的它会打出来一个资源文件。
第二步,我们通常是会把我们需要在项目当中使用的资源,加入到我们的资源组里面。
第三步,我们通常会把这些资源进行一个打包。打包以后呢,就会按照一个资源组一个资源包,一个资源组一个资源包的方式,那么形成最终我们可以在游戏项目当中所使用所更新的这些资源包。
第四步,在我们打包完以后,就要去加载这些资源。unity支持资源的本地打包和本地加载。也就是说直接从你的安装包里面去加载,他也支持不打到你的安装包里面,而是从远程服务器来进行资源加载。
Addressable的操作实现




我们的资源打包在Windows64位这个文件夹下面

里面会有三个资源目录。

第一个资源目录叫做local-assest-all大家注意这个名字,通过这个名字我们就知道它对应的实际上就是我们的本地的资源组。然后这个后缀都是Addressable在打包的时候它自动加的。

第二个local开头的,还是本地的文件。这个是unity在启动程序的时候,会把一些默认的比如说在渲染这个小球的时候,他会用一个默认的Shader来进行渲染,这个渲染用的Shader也必须打包。如果不打包的话,将来就没有办法去使用这些Shader。






如果你使用第一种方式,它直接就是从项目资源里面去加载。

这个工具可以添加我们的老师QQ:1517069595领取

我们将小球改成黄色,并且把打包路径中的选项选择为远程,加载远程资源,如图,注意我们在第一次打包红色小球时,就应当将他设置成远程。

但是只有当我们使用它的时候才被加载出来,这叫做边下边玩的模式。我用到什么资源他才去下载。但是实际上这种方式并不太符合我们国内游戏厂商的一种资源热更新的方式。所以在我们的系统课程里面,我们会去教大家如何像国内游戏一样,在启动的时候先弹一个公告。如果有资源更新,弹一个资源更新的请求框,如果你点了确认以后一次性的把游戏需要更新的资源更新下来。而不是说我一边玩,然后我这边要用到某一个资源来从服务器下载。这样的话会造成一个问题。就是如果你一边下一边玩,比如说你在战斗的时候,他在那儿去下载资源,这个时候游戏的体验也很不好,所以说国内的游戏很多都不是边下边玩。


第一部分,资源卸载

我们知道了这个Addressable会根据配置好的路径去加载资源。一种是本地路径,一种是远程路径,我们用InstatiateAsync这个函数。那么我们如何去释放一个对象呢?就是如果你想要去释放你这个实例化的对象,那么我们只需要用ReleseInstance就可以了。
如果是一些图片资源,一些动画资源,模型资源,那么我们就不能实例化,因为它不是场景对象。那么我们就可以用LoadAssestAsync来去进行加载,然后用Release来进行释放。
另外关于Async也就是异步,在外面的系统课程里面会详细给大家讲。这里就给大家简单讲一下。





那么当然在ios平台上面,你做的事情可能比更新程序集要复杂一点。在安卓平台上,只要去更新我的程序集,然后通过反射加载这个程序就可以了。但是ios因为它限制了动态的去载入新的程序集到APP里面来进行执行,所以的话我们需要有一个基于lLRuntime的热更新的方案。
关于这方面的内容呢,大家也可以参考一下我们的系统课程,我们的皇室战争S3是全网为数不多的去详细的给大家讲解一个是客户端,一个是服务器双端热更的一个解决方案。


比如说一个游戏当中的一个游戏单位,这个游戏单位呢他可能有很多份,比如说游戏当中有弓箭手,你可能有很多相同的弓箭手。这个时候呢这个弓箭手资源它就会被使用很多次。当这个资源不使用了,当这个弓箭手资源在场景里面全部销毁不使用的时候。那么我们说它的使用次数就变成零。Addressable它会检测到引用次数为零,这样的一些资源,然后做对应的资源释放,那么它内部的资源释放的原理是什么,引用技术是如何实现的。



第一个是总体流程,
第二个是如何实现热更新。
第三个我们讲了Addressable在商业项目当中的八大特性。这个商业项目当中必须要掌握的点。那么同时也是你在笔试面试环节必须要掌握的一些关于资源管理的一些点。你掌握了这些点以后,可以说让大家在应对笔试面试的时候不会这个遇到一些障碍。
我们还会在我们的AssetBundle里面去给大家讲解传统的AssetBundle的热更新的框架,热更新如何实现。那么那么关于进一步的学习内容呢需要更多的时间。
可以添加我们的老师领取更多公开课。
更多学习资源请加QQ:1517069595获取(/企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
完整视频可以点击B站链接:https://www.bilibili.com/video/BV1KU4y1L72h/