您的位置:首页 > 移动开发 > Unity3D

Unity5.x ScriptableObject数据存储结合AssetBundle打包实现数据资源热更新

2018-03-03 12:53 1851 查看

Unity5.x ScriptableObject数据存储结合AssetBundle打包实现数据资源热更新

这次在项目开发中,无意了解到ScriptableObject数据存储功能,在结合AssetBundle来实现资源和数据的热更新。当然这里只是资源和数据的更新,并没有做到代码的更新。因为本人项目中并没有去真正的使用,所以不去讲解代码的热更新,有机会在项目用使用时在进行详解。

在项目开发过程中,我一直想要将美术资源,以及一些数据配置抽离出来,方便以后进行更新,但是苦于自己那时候了解太少,所以在之前的项目中没有真正使用到。这次在新项目开发中,无意了解到这个ScriptableObject,在结合AssetBundle打包来实现数据资源更新,经过本人测试也是没有问题的,当然我的是将资源放在本地,不过本地与网络其实差别并不是特别大。

目录

Unity5.x ScriptableObject数据存储结合AssetBundle打包实现数据资源热更新
目录

ScriptableObject详解
什么是ScriptableObject

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的文件,你也不需要重新发布。当然前提是需要你把规则制定好,比如服务器的资源和本地资源的匹配,这个一般都是根据情况来进行处理的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息