赞
踩
【此文章转载于细谈unity资源管理的设计】
本文主要说说Unity是如何管理的,基于何种方式,基于这种管理方式,又该如何规划资源管理,以及构建bundle,是后面需要详细讨论的。
unity项目中的资源,大体上可以分为外部导入资源和内部生成资源两种类型
外部导入资源:美术生成的大部分资源,都是外部带入资源。模型,贴图,UI用图,基本是美术工具生成后,导入到工程中的。
内部生成资源:部分美术生成资源,例如材质,shader,特效,场景等,属于基于Unity引擎来制作生成的,此外各种prefab(UI/角色等),以及代码脚本(C#为主),也属于Unity的内部生成资源。
在资源导入到unity工程之后,会以各种方式进行转换存储,主要有一下几种:
对于工程中的脚本类资源,主要分为plugin和非plugin两类
所有最终构建到游戏包中的dll,主要分为:
美术类资源,分为外部导入和内部生成两个大类
外部导入类:场景/模型/贴图 都可以的外部导入
内部生成类:shader/材质/prefab/场景 均可以内部生成美术资源的贴图资源和特效资源,属于重点关注对象,后面会细谈这几个资源的管理。
工程资源划分好后,如何对这些资源进行管理?不同的引擎有不同的管理方式,那么在unity中是如何管理的?
这儿管理分为2个步骤:序列化和meta文件的生成
工程中的资源,要存储到本地磁盘,那么就会通过引擎进行进一步序列化的操作,序列化的本质,就是将资源对象按照一定的顺序转换成二进制文件。
在完成序列化后,unity会对应的为该文件生成一份meta文件,这份meta文件会跟随者该文件一直存在,如果删除该资源文件,其对应的meta文件也会被引擎自动删除。
meta文件的主要构成:
文件的guid: 这个文件的全工程中的唯一索引id,基于该id,可以对应的查找到该文件。guid的生成本质,就是基于文件的路径来进行转换生成的,同理,如果多个工程合并的时候出现guid冲突,可以自己生成一份guid,相关连接:https://gist.github.com/ZimM-LostPolygon/7e2f8a3e5a1be183ac19
文件的导入设置:
除了meta文件的guid,unity还会为每个资源生成一份文件id,也就是fileID,不过现在fileID已经不在保留在meta文件中了,保留到文件的序列化文件中了,对于该资源,还会有一份localID,这个localID,对应的就是在一个资源中包含多个子资源的时候,定位每个子资源所用:
那么序列化是如何与guid/fileID关联的?
在unity工程内部,如果给资源添加其他资源的引用,例如加一个脚本,拖拽一个外部引用,那么就会触发一次序列化操作,序列化操作的时候,就会将引用的资源的fileID和guid都序列化下来,这样在反序列化的时候,就会基于fileID和guid来反向找到依赖的资源,从而加载进来。
这个过程,在Unity中,就是一个装载的过程,多说一句,如果一个资源依赖的其他资源越多,那么这个装载过程就会越耗时,所以在打开一个很大的UI的时候,有一部分的时间是消耗在装载UI上各个组件上的。
基于前文,可以对整个unity的资源管理有一个初步的认识,基于meta文件和序列化操作,可以管理工程中的资源,同时也能管理好各个资源的互相引用,那么基于这样的设计,在构建bundle的时候,是可以进行相关的设计和实现的。
【此文章转载于细谈unity资源管理的设计】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。