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的资源是如何从磁盘中加载到运行时的内存中,以及又是如 ...
随机推荐
- 【并发编程】AIDL关键字
oneway Oneway interfaces In early betas, the Android IPC was strictly synchronous. This means that s ...
- 开源项目——小Q聊天机器人V1.4
小Q聊天机器人V1.0 http://blog.csdn.net/baiyuliang2013/article/details/51386281 小Q聊天机器人V1.1 http://blog.csd ...
- UNIX网络编程——UDP编程模型
使用UDP编写的一些常见得应用程序有:DNS(域名系统),NFS(网络文件系统)和SNMP(简单网络管理协议). 客户不与服务器建立连接,而是只管使用sendto函数给服务器发送数据报,其中必须指定目 ...
- linux目录间的瞬间转移:dtags
http://blog.csdn.net/pipisorry/article/details/50923957 linux下dtags的安装 apt-get install python3-pip # ...
- eclipse代码恢复(开发程序代码恢复)
如果误操作,让本地代码丢失了不用怕,Eclipse local history可以恢复. 误删除文件后,直接ctrl+z可以恢复. 拉去代码覆盖了本地,也可以一个一个或者整体进行恢复:http://b ...
- Android开发技巧——PagerAdapter的再次简单封装
这次再对内容为View的ViewPager的适配器PagerAdapter进行简单的封装,支持List数据和SparseArray的数据,带更新视图功能. 首先,先贴上最上面的抽象类代码: /* * ...
- Gradle 1.12 翻译——第十八章. 日志
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
- Spring boot之hello word
环境准备 一个称手的IDE(首选Myeclipse,也可以选Eclipse) Java环境(JDK 1.7或以上版本) Maven 3.0+(Eclipse和Idea IntelliJ内置,如果使用I ...
- Ajax分页 Spring MVC + Hibernate
效果图: 1. 添加公共类.方法.代码 1. 分页类:Page.java package cn.com.aperfect.sso.base.dao; import java.util.Arra ...
- 怎样写一个与Windows10 IE11兼容的标准BHO?
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...