unity 资源加载框架设计

来源:互联网 发布:免费cad制作软件 编辑:程序博客网 时间:2024/05/16 10:09

本篇文章主要介绍了"unity 资源加载框架设计",主要涉及到unity 资源加载框架设计方面的内容,对于unity 资源加载框架设计感兴趣的同学可以参考一下。

目的

便于增量更新功能的实现

降低安装包大小,unity不支持过滤掉Resources目录中不用的文件。

用AB包的方式加快资源文件的读取速度

生成asset bundle文件

基本流程如下图所示, 后面会详细说明。

BundleResources目录的资源组织

现在游戏中的资源放在Resources目录中,需要把这些资源按照一定的规则移动到BundleResources目录中。并且这个文件组织规则需要告知策划,美术,以后策划美术就把资源放到对应的目录中。下图是基本的组织方式。

 

游戏中的UI用到的图片分三个目录组织,如上图所示,Common目录存放战斗和主城共用的资源, Battle存放战斗用到的资源,City存放主城用到的资源。

UI目录存放美术做的UI Prefab,Battle存放战斗用到的UI prefab,City存放主城用到的UI prefab。

LUA文件不放在这里,直接把LUA文件copy到StreamingAssets下面的一个子目录。

 

为文件或者文件夹指定asset Label

指定asset Label是为了后面打AB包用,一个原则是如果很多相同类型的文件需要几乎同时读入内存,比如Atalas图集,一个场景用到的所有音效等。

上图中目录atalas下每个子目录一个AB包。

上图中目录Audio下每个子目录一个AB包。

其余每个文件一个AB包。

打包

调用API BuildPipeline.BuildAssetBundles 打包,这个函数有三个参数

outputPath

Output path for the AssetBundles.

assetBundleOptions

AssetBundle building options.

targetPlatform

Chosen target build platform.

outputPath 为StreamingAssets/BundleResources

assetBundleOptions为BuildAssetBundleOptions.None, 默认用LZMA格式压缩,好处是包会小一点,坏处是打开AB包时需要解压缩。还有两个选项,Chunk Compressed (LZ4)和Uncompressed 这两种方式性能上有优势,但包体会变大。参考这里:https://docs.unity3d.com/Manual/AssetBundleCompression.html

targetPlatform 为打包的目录平台,android, ios or windows.参考这里https://docs.unity3d.com/ScriptReference/BuildTarget.html

生成每个AB包的信息

AB包生成后,我们需要维护每个AB包的信息,所有AB包的信息保存在一个json文件中,用于打开AB包时使用。每一个AB包会生成如下的信息:

bundlePath是在第2步给该文件指定的asset Label,这个路径也是它在StreamingAsset/BundleResources s目录中的路径。

bundleHash 是根据bundlePath生成的一个Hash值。最后一个字段deps里会用到这个值。

Crc 和 hash128是AB包的校验值,用于增量更新时的校验,调用BuildPipeline.GetCRCForAssetBundle和BuildPipeline.GetHashForAssetBundle获得

Deps 是该AB包所依赖的包的bundlePath的hash值。通过调用API AssetBundleManifest.GetDirectDependencies获得。当读取一个AB包时,会把AB包依赖的AB包先读出来。

读取asset bundle文件

所有读取操作都是异步的,调用者需要提供回调函数,读取完成后会调用该函数,参数包含已实例化的对像。

提供3个接口用来读取AB包:

1.     读取一个Scene文件生成的AB包,Scene加载完成调提供的回调函数;

2.     读取一个AB包,该AB包中只包含一个文件,调用者只需要提供文件路径,AB包的包名通过文件路径自动获得。加载完成调提供的回调函数;

3.     读取一个AB包中的一个文件,该AB包中只包含多个文件,加载完成调提供的回调函数;

提供1个接口用来释放对象

针对每个被读取的Gameobject,会生成一个对象池,当调用者不用这个对象时,调用Free函数,该对象会放到对象池中,供下次调用使用。

读取的逻辑如下图所示:


0 0
原创粉丝点击