Unity5.x ScriptableObject数据存储结合AssetBundle打包实现数据资源热更新
这次在项目开发中,无意了解到ScriptableObject数据存储功能,在结合AssetBundle来实现资源和数据的热更新。当然这里只是资源和数据的更新,并没有做到代码的更新。因为本人项目中并没有去真正的使用,所以不去讲解代码的热更新,有机会在项目用使用时在进行详解。
在项目开发过程中,我一直想要将美术资源,以及一些数据配置抽离出来,方便以后进行更新,但是苦于自己那时候了解太少,所以在之前的项目中没有真正使用到。这次在新项目开发中,无意了解到这个ScriptableObject,在结合AssetBundle打包来实现数据资源更新,经过本人测试也是没有问题的,当然我的是将资源放在本地,不过本地与网络其实差别并不是特别大。
目录
ScriptableObject详解
什么是ScriptableObject
什么是ScriptableObject呢?在百度搜索有大量的ScriptableObject方面的资料和使用,这里我就不详细的去讲解了,毕竟我们这里是实战运用。
ScriptableObject就是“脚本化对象”,将这类作为存储结构化的数据来使用,并写入Unity的资源.asset文件去存储一组数据,取用的时候直接作为一个数据对象拿来用。
我们在项目开发中一直听网上说,将资源打包成.asset文件,我一直以为是AssetBundle等等,直到我接触了它原来是ScriptableObject。废话不多说,开始使用ScriptableObject。
ScriptableObject使用
新建一个C#类,只不过继承的不是MonoBehaviour,继承的是ScriptableObject类,所以新建的这个C#类他就不能添加到物体的组件中了,但是他可以作为一个变量对象供其他地方使用。
[注:因为所有的代码和资源都是我在真正项目中的运用,所以有些地方会打上马赛克,敬请谅解!!!][5]
- 新增C#类,继承ScriptableObject,命名为LoadingData.cs
CreateAssetMenu特性是在Unity编辑器中创建一个生成LoadingData.asset文件的按钮 - 在Unity编辑器中,Project窗口中右击就会存在创建LoadingData文件的按钮
- 生成LoadingData文件后,配置好参数
在LoadingData文件中,可以看到这些变量其实就是LoadingData.cs类定义的变量。 - 使用LoadingData文件中的数据
1)一种方式在继承MonoBehaviour的类中声明一个LoadingData变量,然后将这个LoadingData.asset文件拖入到这个变量中。
LoadingData是我们前面所创建的文件,这里我就不进行阐述了。
在LoadingDataTest脚本中,当获取到这个对象后,你就可以进行读取LoadingData.asset文件中所配置好的数据了。然后你就可以进行数据了,至于怎么处理那就根据实际情况来了。[需要注意的是当你在代码中改变了LoadingData.cs字段中的值,那么LoadingData.asset文件中相应的值也会进行永久改变,其实就类似与我们将数据写入到txt文件中][1]。
如下所示:
这里用来做数据的保存和读书还是比较方便的,在有些情况下比txt文件、Json文件、Excel文件等要方便一些,不过还是要根据情况来进行选择。注意哦:如果你是将.asset文件通过AssetBundle打包,然后读取AssetBundle打包文件在解析成.asset文件,这时我就不清楚能不能进行对.asset文件的写操作了。不过按照正常的逻辑来说,应该是不可以的,我也目前没进行测试,所以不发表言论。
2)通过Resources来读取.asset文件。
为了在实际项目中验证这个功能,该测试将通过打开后,查看结果。首先先看代码,读取LoadingData.asset文件,获取到LoadingData对象,并且给Image赋值,验证读取。然后在将LoadingData中图集集合中的第2个元素值赋予第1个元素,验证写入功能。如图:
在编辑器中运行
第一次运行结果,可以看到我们的LoadingData.asset文件中的图片集合元素第一个值已经发生改变了。
第二次运行结果
发布后的运行
第一次启动。
第二次启动。
打包后,第二次运行还是跟第一次运行一样的,图片并没有进行更改。但是我们在编辑器测试是可以进行变动的。所以在真正项目开发这点需要注意。
3)通过WWW读取路径来读取.asset文件。
第三种那就是用过WWW,读取本地的.asset文件了,不是通过Resources.Load()去加载,也不是通过Unity编辑器中的手动拖入赋值。这就需要利用我们的AssetBundle了。
AssetBundle详解
AssetBundle讲解,在我之前的一篇博客中已经详细讲解了,这里就不进行阐述了。Unity5.x AssetBundle依赖项打包详解
ScriptableObject结合AssetBundle运用
- 获取到AssetBundle打包后的文件
我将打包后的文件放入到Unity的StreamingAssets文件夹中,方便我的读取与更新。
通过AssetBundle读取并解析成.asset文件并转化为ScriptableObject
如果不知道怎么读取AssetBundle打包后的文件,可以参考我的博客:Unity5.x AssetBundle依赖项打包详解。
代码如下:
还有一部分没有展示出来,那一部分是AssetBundle的初始化以及读取。当我们读取到ScriptableObejct对象时,就相当于回到了ScriptableObject的运用中了,拿到ScriptableObject对象后,就可以根据自身的情况获取这些数据,需要注意到的是这些数据你只能进行读取,是没办法在代码中进行更改的。同时当你要进行数据的更新时,比如说项目的背景图或者项目的某些数据你需要进行更新,那么你就可以直接替换这个通过AssetBundle的文件,你也不需要重新发布。当然前提是需要你把规则制定好,比如服务器的资源和本地资源的匹配,这个一般都是根据情况来进行处理的。