Unity 3D-新版AssetBundle(实战)

在上一篇博客我介绍了Unity新版AssetBundle系统的一些知识点,在这篇博客中,我用一个小小的Demo来实践一下(Demo的开发工具为Unity5.3.5 + VS2015,请注意IDE版本)。

先准备一个Modle,资源结构如下所示

预制体JuShiGuai使用了材质球Mat1,Mat2,而Mat1,Mat2又分别使用了JuShiGuai_01,JuShiGuai_02两个贴图文件。 Unity 3D-新版AssetBundle(实战)

下面就长话短说直接上代码,具体的用法可以参见上一篇博客

1.设置Modle下的资源的AssetBundleName

  • Mat1 : materials/mat1.unity3d
  • Mat2 : materials/mat2.unity3d
  • JuShiGuai_01 : texture/jushiguai_01.unity3d
  • JuShiGuai_02 : texture/jushiguai_02.unity3d
  • JuShiGuai : jushiguai.unity3d

这儿我直接按原有目录设置,具体情况在实际使用中有待商榷

编写AssetBundle打包代码

  • 为了方便路径的管理,这儿采用我再 Unity 中管理Tag的方式来管理

创建AssetBundleConfig.cs,管理路径

2.创建 AssetBundleBuild.cs,打包AssetBundle

这儿我使用了LZ4压缩格式,保证包的大小和加载速度额均衡

  • 代码编译后会在Unity工具栏挂载 AssetBundle Editor栏,点击菜单栏 AssetBundle Build就会自动对所有设置了assetbundleName的代码进行打包

3.编写AssetBundle加载代码

在传统的方法中,我们加载一个资源,总是加载资源的依赖项-->加载资源-->卸载依赖项,但是当一个资源频繁被其他资源依赖,这样无疑会造成性能问题。

一个可行的解决方案是:我们可以把加载好的资源用字典存着,下次如果还需要加载这个依赖项就可以直接从字典里面读取,程序运行结束后在卸载字典中加载的AssetBundle.

当然可能还会有更好的加载方案,比如统计一个资源的被依赖次数和使用频率,然后定义一个时间周期,将不活跃的资源定期销毁

这儿我就采用字典的方案,把加载好的资源用字典存着

  • 创建 AssetBundleLoad.cs

最后一张程序运行截图奉上

Unity 3D-新版AssetBundle(实战)

4.assetbundleName的自动化设置和清除

新版的AssetBundle虽然提出了AssetBundleName这样一个新的方法。但是在实际工程中,如果对于每个资源都手动添加设置Name。一来会十分麻烦,二来容易出错,三来不方便管理。所以在实际项目中,我们需要一个方法对于一些资源进行批量命名。

一个可行的方案就是,在工程中把资源分类的放好,我们直接读取资源的相对路径+名字,设置为它的assetbundleName,这样AssetBundle打包之后就会有和源资源相同的目录层级结构,更便于管理

  • 创建AssetBundleNameEdit.cs动态的设置清除assetbundleName

代码编译后会在之前的工具栏 AssetBundle Editor下多挂载几个选项,选中某个目录,点击菜单栏选项 SetAssetBundleName(ClearAssetBundleName)就会自动对所有选中目录进行assetbundleName的添加(移除)

关于从服务器加载的实现等有空在补上。

最后附上Demo的git地址

GitHub

Demo的git地址(Click here!

注:Demo的开发工具为Unity5.3.5 + VS2015,请注意IDE版本

 


繁夜