Unity的资源管理
本篇文章翻译自Unity的官方文档,原文地址:https://docs.unity3d.com/Manual/BehindtheScenes.html
Unity自动导入资源的同时为你管理这些资源产生的额外数据,例如导入资源的设置、资源如何在工程中被使用。下面来说明这个过程是如何进行的。
当Unity导入资源的时候发生了什么?
1.分配一个唯一的ID
当你在Assets文件夹中放置一个资源,比如一张贴图。Unity首先会检测到一个新的文件被添加进来了(编辑器会频繁地检查Assets文件夹的内容与已知内容清单对比)。
首先Unity为资源分配一个唯一的ID。Unity在内部使用这个ID去引用资源,意味着资源可以被移动或者重命名,引用都不会被破坏。
2.创建一个.meta文件

你电脑中的工程资源文件和Unity工程窗口的关系
你会注意到上面的图片中,在Assets文件夹下,文件系统中每一个资源和每一个文件夹都有一个对应的.meta文件。这些文件在Unity的工程窗口中是看不到的。Unity为每一个资源创建这些文件,但它们默认情况下是看不到的,所以你在Explorer / Finder 下也是看不到的。你可以通过在Unity中设置它们能够被看见。设置如下:Edit > Project Settings > Editor > Versions Control , Mode : Visible Meta Files.
Unity给每个资源分配的ID存储在旁边的.meta文件中,这个.meta文件必须与它关联的资源保持一致。
重要提示:.meta文件必须匹配并且与它们对应的资源文件保存在一起。如果你在Unity编辑器的工程窗口中移动或者重命名一个资源,Unity也会自动移动或者重命名相应的.meta文件。如果你在Unity的编辑器外部(比如Windows资源文件夹,Mac的Finder文件管理器)中移动或者重命名一个资源,你必须同时移动或者重命名对应的.meta文件。
如果一个资源丢失了对应的.meta文件(比如你在Unity编辑器外部移动或者重命名一个资源,但是没有移动或者重命名相应的.meta文件),导致任何对该资源的引用破坏掉。Unity会生成一个新的.meta文件重新引用该资源,就好像这个资源是重新导入的,同时删除之前丢失了引用的.meta文件。
举个例子,在纹理资源丢失它的.meta文件的情况下,任何引用了该纹理资源的材质将丢失对这个纹理的引用。你必须手动添加任何材质对该纹理的引用。
在脚本资源丢失它的.meta文件的情况下,任何引用了该脚本的游戏对象或者预制体(Prefab)都变成“unassigned”组件,同时会丢失这个脚本的功能。你必须手动再指定这些物体对该脚本的引用。
3.源资源被处理了
Unity读取并且处理任何你添加到Assets文件夹下的文件,将文件内容转换为内部游戏就绪( game-ready)版本的数据。但实际源资源本身并没有被修改,同时根据Unity版本而处理和修改的数据会保存在项目的Library文件夹里面。(注:每个不同的Unity版本生成的就绪资源是不一样的,这就是为什么我们在用不同版本的Unity打开同一个工程的时候会需要资源转换,具体如何转换的这里就不细讲了)
使用内部格式的资源能够允许Unity在编辑器中实时使用游戏素材,保持Assets文件夹下的资源未被改变,以便你能在编辑器中快速地修改和自动更改这些资源。例如,Photoshop的文件格式可以很方便地与Unity协同工作,能够直接放进你的Assets文件夹里,但是像移动设备和PC图形卡这样的硬件设备不能直接用这种格式去渲染贴图。所有的资源的Unity内部数据特征存储在Library文件夹下,你可以认为这就相当于缓存文件夹。作为一个使用者,你不应该手动去更改Library文件夹,试图这样做可能会影响项目在Unity编辑器中的功能。然而,删除Library文件夹总是安全的(当工程没有在Unity中打开的时候),因为所有这个文件夹的数据都是从Assets和ProjectSettings这两个文件夹里的数据生成的。这也就意味着Library文件夹不应该包含在版本控制中。
有时候导入一个资源会创建多个资源
有些资源文件会创建几个资源文件,这可能发生在以下的情况:
- 一个3D文件,比如FBX文件,定义了材质亦或包含了贴图。
这种情况下,定义的材质和嵌入的贴图在Unity中会提取为几个分开的资源
- 一个图片文件导入成一个精灵(sprite)
一张单一的图片通过使用Unity的精灵(sprite)编辑器有可能被定义成几个精灵文件。这种情况,在工程窗口中(Project Window)每一个编辑器定义的精灵都会分开成为一个单独的精灵资源。
- 一个包含有多个动画时间的3D文件,或者在动画导入设置的时候拥有多个分开的动画片段
这种情况,多个动画片段在工程目录下会以几个分开的动画资源的方式显示。
导入设置会改变对资源的处理
随着分配给资源的唯一的ID,.meta文件包含了所有你在工程窗口中选择一个资源时的导入设置(import settings)的值。对于一张贴图,它的导入设置就包含了贴图类型,循环模式,过滤模式,各向异性等级。
如果你改变一个资源的导入设置,这些更改的设置就会保存在相应的.meta文件中。资源会根据你的新设置重新导入资源,对应的 “game-ready” 资源会在工程的Library文件夹下更新。
当备份,或者添加一个工程到版本控制仓库(Repertory)的时候,你应该包含Unity的主工程文件夹,里面包括Assets和ProjectSettings文件夹(不需要包含Temp和Library文件夹)。所有这两个文件夹的信息对于Unity工程的运行都是至关重要的。
注意:如果没有明确地启用这些功能的话,Unity 4.2或者更早的版本创建的工程可能没有.meta文件。删除这些工程的Library文件夹会导致数据丢失并且永久的工程损坏,因为资源生成的内部格式文件和对应的.meta文件都存储在Library文件夹中。
Unity的资源管理的更多相关文章
- 【Unity】使用AssetDatabase编辑器资源管理
最近参考了各位大神的资源,初步学习了Unity的资源管理模式,包括在编辑器管理(使用AssetDatabase)和在运行时管理(使用Resources和AssetBundle).在此简单总结编辑器模式 ...
- 细谈unity资源管理的设计
一.概要 本文主要说说Unity是如何管理的,基于何种方式,基于这种管理方式,又该如何规划资源管理,以及构建bundle,是后面需要详细讨论的. 二.Unity的资源管理方式 2.1 资源分类 uni ...
- 玩转Unity资源,对象和序列化(下)
本文将从Unity编辑器和运行时两个角度出发,主要探讨以下两方面内容:Unity序列化系统内部细节以及Unity如何维护不同对象之间的强引用.另外还会讨论对象与资源的技术实现差别. 译注:除非特别说明 ...
- 玩转Unity资源,对象和序列化(上)
这是一系列文章中的第二章,覆盖了Unity5的Assets,Resources和资源管理 本文将从Unity编辑器和运行时两个角度出发,主要探讨以下两方面内容:Unity序列化系统内部细节以及Unit ...
- Unity中的内存泄漏
在对内存泄漏有一个基本印象之后,我们再来看一下在特定环境——Unity下的内存泄漏.大家都知道,游戏程序由代码和资源两部分组成,Unity下的内存泄漏也主要分为代码侧的泄漏和资源侧的泄漏,当然,资源侧 ...
- 【Unity】AssetBundle的使用——打包/解包
最近参考了各位大神的资源,初步学习了Unity的资源管理模式,包括在编辑器管理(使用AssetDatabase)和在运行时管理(使用Resources和AssetBundle).在此简单总结运行时用A ...
- 【Unity】使用Resources类管理资源
最近参考了各位大神的资源,初步学习了Unity的资源管理模式,包括在编辑器管理(使用AssetDatabase)和在运行时管理(使用Resources和AssetBundle).在此简单总结运行时用R ...
- Unity3D - 资源管理
一直没有总结过Unity的资源管理,都是随用随看文档.今天有人问起,总结一下.加深对Unity资源管理的理解. 主要參考了Unity官方文档之Resources和AssetBundle. Unity有 ...
- 细谈unity资源加载和卸载
转载请标明出处:http://www.cnblogs.com/zblade/ 一.概要 在了解unity的资源管理方式之后,接下来细谈一下Unity的资源是如何从磁盘中加载到运行时的内存中,以及又是如 ...
随机推荐
- 1.QT中的容器QVector,QList,QSet,QMap,QQueue,QStack,QMultiMap,QSingleList等
1 新建一个项目 在pro文件中只需要加上CONFIG += C++11 main.cpp #include <QMap> int main() { QMap<int,QStrin ...
- C++对象模型的那些事儿之六:成员函数调用方式
前言 C++的成员函数分为静态函数.非静态函数和虚函数三种,在本系列文章中,多处提到static和non-static不影响对象占用的内存,而虚函数需要引入虚指针,所以需要调整对象的内存布局.既然已经 ...
- 如何在Cocos2D游戏中实现A*寻路算法(五)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- pig的udf编写
http://www.cnblogs.com/anny-1980/p/3673569.html http://blog.csdn.net/ruishenh/article/details/120480 ...
- ROS_Kinetic_10 ROS程序基础Eclipse_C++(一)
ROS_Kinetic_10 ROS程序基础Eclipse_C++(一) 编写简单的消息发布器和订阅器 (C++) http://wiki.ros.org/cn/ROS/Tutorials/Writi ...
- 安装Compass时不能访问服务器的问题
今天安装Compass,居然老是提示网络问题,后来根据错误提示,发现带https的域名是访问不了的,是是SSL问题.后来搜了一下,在stackoverflow找到一个人说,将https的去掉就好了.具 ...
- 小老虎的微信公众号:iITObserve
小老虎的微信公众号:iITObserve 现在,都流行玩微信. 现在,都流行玩微信公众号. 所以,博客已经Out啦! 原来是微博,现在是微信.真的,时代发展太快了. 偶赶紧也弄了一个,尝尝鲜. 偶的微 ...
- javascript之DOM编程改变CSS样式(简易验证码显示)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- VC和GCC静态变量析构顺序不同
VC和GCC静态变量析构顺序不同(金庆的专栏)静态变量析构顺序正常情况下是构造的反序.但是VC对DLL中的静态变量好像是需等待DLL卸载时再析构,表现为主程序中的静态变量先析构,DLL中的静态变量后析 ...
- [java]Windows 7 配置jdk 1.7环境变量
来自百度文库 Windows 7 配置jdk 1.7环境变量 环境:win7(32位)64位和下面差不多 jdk1.7 1.右击计算机-属性-高级系统设置-高级-环境变量,弹出&quo ...