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 MVVM 应用框架
概述 说到Android MVVM,相信大家都会想到Google 2015年推出的DataBinding框架.然而两者的概念是不一样的,不能混为一谈.MVVM是一种架构模式,而DataBinding是 ...
- (一一九)通过CALayer实现阴影、圆角、边框和3D变换
在每个View上都有一个CALayer作为父图层,View的内容作为子层显示,通过layer的contents属性决定了要显示的内容,通过修改过layer的一些属性可以实现一些华丽的效果. [阴影和圆 ...
- 自定义圆角透明的Dialog
自定义圆角透明的Dialog 说明 系统默认的Dialog默认是背景不透明的,有时候项目需要Dialog为圆角透明,这个时候的解决方案就是---重写Dialog - 系统样式 - 自定义以后的样式 自 ...
- Android中利用Camera与Matrix实现3D效果详解
本文行文目录: 一.Camera与Matrix初步认识 二.Camera与Matrix旋转效果拆分介绍 三.Camera与Matrix实现立体3D切换效果 [csdn地址:http://blog.cs ...
- 安卓中不同APP之间的消息通信
昨天在腾讯实习生招聘初试面试时面试官问道我关于两个APP之间相互通信的方式,当时自己回道到了contentProvider与BroadcastReceiver.但他接着问还有没有其它的方式,我跟他说可 ...
- 详解EBS接口开发之更新供应商付款方法
更新供应商地点层的付款方法API DECLARE --API 参数 l_external_payee_rec_type iby_disbursement_setup_pub.external_paye ...
- python脚本程序,传入参数*要用单引号'*'
*号作为python脚本的传入参数时,必须用单引号'',才能正确传入.如python test.py 2014 '*' age python test.py 2014 * age是错误的. 比如 te ...
- Oracle EBS SLA 详解
SLA概述 SLA :子分类账(Subledger Accounting),这个在R12中大力宣扬的内容,我们通常的认为总账就是对Journal的汇总,但是在实际的操作中我们会发现,对于Sub sys ...
- UNIX环境高级编程——守护进程
一.守护进程简介 守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系 ...
- PO核准通知界面修改
想在notification頁面把供應商的稅捐代碼帶出來,添在如下紅框中 PO_WF_PO_NOTIFICATION head information:get_po_approve_msg line ...