细谈unity资源管理的设计

 

转载请标明出处:http://www.cnblogs.com/zblade/

 

1、概要

本文主要说说Unity是如何管理的,基于何种方式,基于这种管理方式,又该如何规划资源管理,以及构建bundle,是后面须要详细讨论的。git

2、Unity的资源管理方式

2.1 资源分类

unity项目中的资源,大致上能够分为外部导入资源和内部生成资源两种类型。
外部导入资源: 美术生成的大部分资源,都是外部带入资源,模型,贴图,UI用图,基本是美术工具生成后,导入到工程中的。
内部生成资源: 部分美术生成资源,例如材质,shader,特效,场景等,属于基于Unity引擎来制做生成的,此外各类prefab(UI/角色等),以及代码脚本(c#为主),也属于Unity的内部生成资源。
github

2.2 资源的存储方式

在资源导入到unity工程后,会以各类方式进行转换存储,主要有如下几种:c#

2.2.1 脚本类资源

对于工程中的脚本类资源,主要分为plugin和非plugin两类。编辑器

  • plugin类:在plugin中引用的dll, 属于本身生成相关的dll,在最终构建游戏包的时候,被打入到相关游戏包中:      
  • 非plugin类:unity会构建成4个基本的dll, 构建的顺序为:
    • Assembly-CSharp-firstpass: standard assets/Pro standard assets/plugins 中的脚本
    • Assembly-CSharp-Editor-firstpass: editor scripts in standard assets/Pro standard assets/plugins 这个dll不会被打入到游戏包中,属于编辑器下特有的dll
    • Assembly-CSharp: all other scripts that not inside editor 主体游戏逻辑的dll
    • Assembly-CSharp-Editor: all remaing scripts inside editor 这个dll也不会被打入到游戏包中,编辑器中特有的dll

全部最终构建到游戏包中的dll,主要分为:ide

  • Assembly-CSharp.dll/Assembly-CSharp-firstpass.dll 这2个主要游戏逻辑dll
  • 引擎dll和插件引用的dll

2.2.2 美术类资源

美术类资源,分为外部导入和内部生成两个大类工具

  • 外部导入类: 场景/模型/贴图 均可之外部导入
    • 继承自AssetPostprocesser后,能够对导入的贴图,材质,模型,场景,均执行相关的修改
  • 内部生成类: shader/材质/prefab/场景 都可之内部生成美术资源的贴图资源和特效资源,属于重点关注对象,后面会细谈这几个资源的管理
    • 修改操做同上

2.2.3 meta文件

工程资源划分好后,如何对这些资源进行管理? 不一样的引擎有不一样的管理方式,那么unity中是如何管理的?
这儿管理分为2个步骤:序列化和meta文件的生成ui

2.2.3.1 unity的序列化

工程中的资源,要存储到本地磁盘,那么就会经过引擎进行一步序列化的操做,序列化的实质,就是将资源对象按照必定的顺序转换成二进制文件。spa

2.2.3.2 meta文件的生成

在完成序列化后,unity会对应的为该文件生成一份meta文件,这份meta文件会跟随该文件一直存在,若是删除该资源文件,其对应的meta文件也会被引擎自动删除。
meta文件的主要构成:插件

  • 文件的guid: 这个文件的全工程中的惟一索引id,基于该id,能够对应的查找到该文件。guid的生成本质,就是基于文件的路径来进行转换生成的,同理,若是多个工程合并的时候出现guid冲突,能够本身从新生成一份guid,相关连接: https://gist.github.com/ZimM-LostPolygon/7e2f8a3e5a1be183ac19设计

  • 文件的导入设置:

    • 对于通常的文件,导入设置都比较简单脚本类叫MonoImporter, 资源类叫NativeFormatImporter
    • 贴图属于须要重点关注的类型,其导入类型叫TextureImporter,里面详细的列出对该贴图的各类压缩格式,mipmaps, 类型,uv,贴图大小等等详细的设置信息

2.2.4 基于meta文件和序列化的资源管理

除了meta文件的guid,unity还会为每一个资源生成一份文件id,也就是fileID, 不过如今fileID已经再也不保留在meta文件中了,保留到文件的序列化文件中了,对于该资源,还会有一份localID, 这个localID, 对应的就是在一个资源中包含多个子资源的时候,定位每一个子资源所用:  

那么序列化是如何与guid/fileID关联的?
在unity工程内部,若是给资源添加其余资源的引用,例如加一个脚本,拖拽一个外部引用,那么就会触发一次序列化操做,序列化操做的时候,就会将引用的资源的fileID和guid都序列化下来,这样在反序列化的时候,就会基于fileID和guid来反向找到依赖的资源,从而加载进来。   

这个过程,在Unity中,就是一个装载的过程,多说一句,若是一个资源依赖的其余资源越多,那么这个装载过程就会越耗时,因此在打开一个很大的UI的时候,有一部分的时间是消耗在装载UI上各个组件上的。

3、总结

基于前文,能够对整个unity的资源管理有一个初步的认识,基于meta文件和序列化操做,能够管理工程中的资源,同时也能管理好各个资源的互相引用,那么基于这样的设计,在构建bundle的时候,是能够进行相关的设计和实现的。

相关文章
相关标签/搜索