细谈unity资源管理的设计
一、概要
本文主要说说Unity是如何管理的,基于何种方式,基于这种管理方式,又该如何规划资源管理,以及构建bundle,是后面需要详细讨论的。
二、Unity的资源管理方式
2.1 资源分类
unity项目中的资源,大体上可以分为外部导入资源和内部生成资源两种类型。
外部导入资源: 美术生成的大部分资源,都是外部带入资源,模型,贴图,UI用图,基本是美术工具生成后,导入到工程中的。
内部生成资源: 部分美术生成资源,例如材质,shader,特效,场景等,属于基于Unity引擎来制作生成的,此外各种prefab(UI/角色等),以及代码脚本(c#为主),也属于Unity的内部生成资源。
2.2 资源的存储方式
在资源导入到unity工程后,会以各种方式进行转换存储,主要有以下几种:
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,主要分为:
- Assembly-CSharp.dll/Assembly-CSharp-firstpass.dll 这2个主要游戏逻辑dll
- 引擎dll和插件引用的dll
2.2.2 美术类资源
美术类资源,分为外部导入和内部生成两个大类
- 外部导入类: 场景/模型/贴图 都可以外部导入
- 继承自AssetPostprocesser后,可以对导入的贴图,材质,模型,场景,均执行相关的修改
- 内部生成类: shader/材质/prefab/场景 均可以内部生成美术资源的贴图资源和特效资源,属于重点关注对象,后面会细谈这几个资源的管理
- 修改操作同上
2.2.3 meta文件
工程资源划分好后,如何对这些资源进行管理? 不同的引擎有不同的管理方式,那么unity中是如何管理的?
这儿管理分为2个步骤:序列化和meta文件的生成
2.2.3.1 unity的序列化
工程中的资源,要存储到本地磁盘,那么就会通过引擎进行一步序列化的操作,序列化的实质,就是将资源对象按照一定的顺序转换成二进制文件。
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上各个组件上的。
三、总结
基于前文,可以对整个unity的资源管理有一个初步的认识,基于meta文件和序列化操作,可以管理工程中的资源,同时也能管理好各个资源的互相引用,那么基于这样的设计,在构建bundle的时候,是可以进行相关的设计和实现的。
细谈unity资源管理的设计的更多相关文章
- 细谈unity资源加载和卸载
转载请标明出处:http://www.cnblogs.com/zblade/ 一.概要 在了解unity的资源管理方式之后,接下来细谈一下Unity的资源是如何从磁盘中加载到运行时的内存中,以及又是如 ...
- Unity5 AssetBundle资源管理架构设计
http://blog.csdn.net/qq_19399235/article/details/51702964 1:Unity5 资源管理架构设计(2017.4.22版本) 2:Android 热 ...
- 浅谈Hybrid技术的设计与实现第二弹
前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...
- Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解
在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...
- Spark RDD概念学习系列之细谈RDD的弹性(十六)
细谈RDD的弹性 所谓,弹性,是指在内存不够时可以与磁盘进行交换. 弹性之一:自动的进行内存和磁盘数据存储的切换 弹性之二:基于Lineage(血缘)的高效容错 弹性之三:Task如果失败会 ...
- 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)
http://www.taidous.com/article-667-1.html 前言 首先,这个系列文章做个大致的介绍,题目"浅谈Unity",因为公司和国内大部分3D手游开发 ...
- Css的使用细谈
Css的使用细谈 Css可以通过简单的更改CSS文件,改变网页的整体表现形式,可以减少我们的工作量,所以她是每一个网页设计人员的必修课. Css简介 (1) CSS是用于布局 ...
- 细谈HTML解析模块
细谈HTML解析模块 Html在网页中所占的位置,用一个简单直观的图给展示一下:
- 浅谈Hybrid技术的设计与实现第三弹——落地篇
前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...
随机推荐
- css3-5 css3鼠标、列表和尺寸样式怎么用(文字有关的样式会被继承)
css3-5 css3鼠标.列表和尺寸样式怎么用(文字有关的样式会被继承) 一.总结 一句话总结:css标签中文字有关的样式会被继承.由常用样式记起. 1.鼠标常用样式有哪些? cursor:poi ...
- Mac OSX 下配置 LNMP开发环境
不久前负责了一个项目需要配置PHP7的开发环境,因为之前所有的项目用的是PHP5的,所以研究了这些东西,但是很遗憾,电脑出了问题,不得已重装了系统,然后你懂得...什么都没有了,要重新来过.. 虽然本 ...
- zzuli OJ 1128: 课程平均分
Description 期末考试结束,班主任拿到了本班学生的成绩汇总表.由m行n列组成(本班共同拥有m名学生,本学期有n门课程),每行是一个同学的n门课程成绩,请编敲代码,计算并输出每门课的平均分.结 ...
- Kolya and Tandem Repeat
Kolya and Tandem Repeat time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- 每天一个JavaScript实例-检測表单数据
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- Maven学习笔记(六):生命周期与插件
何为生命周期: Maven的生命周期就是为了对全部的构建过程进行抽象和统一.Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完好的.易扩展的生命周期.这个生命周期包括了项目的清 ...
- Eclipse使用异常——tomcat启动
Eclipse使用异常--tomcat启动 一:问题描写叙述 Eclipse刚上手.非常多地方与Myeclipse不一样的地方.比方tomcat的使用.真心的蛋疼. 环境:JDK7.TOMCAT7.E ...
- erlang浅谈
优点: 1.面向并发,有成熟而且久经考验的框架可供使用,网络部分已经经过了良好封装 2.内存缓存解决方案进程字典,前者的读写速度是50NS-100Ns级别的 3.对二进制数据解析的语法是直观,简单,强 ...
- ANR问题分析实例
ANR监测机制包含三种: Service ANR,前台进程中Service生命周期不能超过20秒,后台进程中Service的生命周期不能超过200秒. 在启动Service时,抛出定时消息SERVIC ...
- 通过引入SiteMesh的JSP标签库,解决Freemarker与SiteMesh整合时,自定义SiteMesh标签的问题
不少web项目,都用到了SiteMesh.SiteMesh可以和JSP.Freemarker等模版进行整合,有一定的好处,当然也有其不好的地方.我个人觉得,如果没有必要,不要在项目中引入太多的工具和技 ...