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的资源是如何从磁盘中加载到运行时的内存中,以及又是如 ...
随机推荐
- 自己动手实现一个Android Studio插件
在使用Android Studio开发的时候,大部分人都会使用一些插件来提高开发效率,例如我们所熟知的butternife,selector,,GsonFormat等,这些分别从不同的原理来帮助我们提 ...
- shell的date日期循环方法:日期格式转时间戳计算,再将时间戳转回日期格式
1,日期对象转时间戳current_day 2,计算增量的时间戳,即循环每步的增量one_day 3,循环体计算,日期变量加增量后重新赋值自己 4,时间戳转回日期格式后输出 current_day=2 ...
- 关于AndroidSDK配置时的tools目录下找不到adb.exe的错误
欢迎关注公众号,每天推送Android技术文章,二维码如下:(可扫描) 在配置android SDK的时候,有时会发现在android-sdk-windows\tools目录下并没有adb.exe,这 ...
- Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架
类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Jav ...
- 运用 三种 原生 谷歌 阿里 解析和生成json
三种类生成JSON数据方法 JSON(原生): 第一种 JSONStringer和JSONObject区别在于添加对象时是按顺序添加的比如说 JSONStringer 添加 a:1 b:2 c:3那么 ...
- 【java集合框架源码剖析系列】java源码剖析之ArrayList
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 本博客将从源码角度带领大家学习关于ArrayList的知识. 一ArrayList类的定义: public class Arr ...
- ajax post请求request.getParameter("")取值为null
今天在写提交一个json数据到后台,然后后台返回一个json数据类型.但是发现后台通过request.getParamter("")取到的值为null. 于是写一个简单的ajax ...
- Swift基础之:新的访问控制fileprivate和open
(转载的,暂时没有研究过这类语句,有空看看) 在swift 3中新增加了两种访问控制权限 fileprivate和 open.下面将对这两种新增访问控制做详细介绍. fileprivate 在原有的s ...
- Windows2003下用Dreamweaver打开CodeSmith文件设置办法
.在第一行的ASP,字符串后面添加CST,2.找到行ASP,ASA:ActiveServer Pages修改为ASP,ASA,CST:ActiveServer Pages 二.用记事本打开文件2:C: ...
- 汉字转拼音的Oracle函数
前言: 最近处理一个特殊的问题,需要用到汉字自动转换拼音的功能. 解决: 在这里找了不少资料,都是有所缺陷,而且也好像很绕.其实是一个很简单的东东.后来还是自己写了一个函数获取.分享出来,给有需要的X ...