Unity中的资源——Asset

Unity中的资源——Asset


文章目录

  • Unity中的资源——Asset
    • 什么是Asset
    • 什么是Objects
    • Unity文件、文件引用、Meta详解
    • Meta文件详解——Unity GUID/ FileID/ InstanceID系统
    • 总结
    • 参考文章


什么是Asset

Asset理解为Unity能够识别的文件。即Projects窗口里看到的单个文件(或者文件夹),Unity会自动为其生成一个.meta文件。
这里其实又包含两种类型,一种是Unity原生支持的格式,比如:材质球;
一种是需要经过Unity处理之后才能支持的,比如:FBX。
对于需要处理才能支持的格式,Unity都提供了导入器(Importer),经过Unity处理之后存放在Library目录下。
在Unity中点击这样的资源,在Inspector面板会出现设置界面。

什么是Objects

而Objects这里我们指的是从UnityEngine.Object继承的对象,它其实是一个可以序列化的数据,用来描述一个特定的资源的实例。
它可以代表任何Unity引擎所支持的类型,比如:Mesh、Sprite、AudioClip or AnimationClip等等。

大多数的Objects都是Unity内置支持的,但有两种除外:ScriptableObject,MonoBehaviour。
ScriptableObject:用来提供给开发者进行自定义数据格式的类型。从该类继承的格式,都可以像Unity的原生类型一样进行序列和反序列化,并且可以从Unity的Inspector窗口进行操作。
MonoBehaviour:提供了一个指向MonoScript的转换器。MonoScript是一个Unity内部的数据类型,它不是可执行代码,但是会在特定的命名空间和程序集下,保持对某个或者特殊脚本的引用。
Asset 和 Objects之间是一对多的关系,比如一个Prefab我们可以认为是一个Asset,但是这个Prefab里可以包含很多个Objects,比如:如果是一个UGUI的Prefab,里面就可能会有很多个Text、Button、Image等组件。

Unity文件、文件引用、Meta详解

Assets下常见的资源分为6种:
——1.资源文件:FBX文件、贴图文件、音频文件、视频文件和动画文件等。像这类文件,Unity中都会在导入时进行转化,每一个类型都对应一个AssetImporter。
——2.代码文件:代码文件包括所有的代码文件、代码库文件、Shader文件等。在导入时,Unity会进行一次编译。
——3.序列化文件(数据文件):序列化文件通常是指Unity能够序列化的文件,一般是Unity自身的一些类型,比如Prefab(预制体)、Unity3d(场景)文件、Asset(ScriptableObject)文件、Mat文件(材质球),这些文件能够在运行时直接反序列化为对应类的一个实例。
——4.文本文档:文本文档比较特殊,它不是序列化文件,但是Unity可以识别为TextAsset。很像资源文件,但是又不需要资源文件那样进行设置和转化,比如txt、xml文件等等。
——5.非序列化文件:非序列文件是Unity无法识别的文件,比如一个文件夹也会被认为是一个文件,但是无法识别。
——6.Meta文件:Meta文件在Unity中的作用非常关键,它有2个作用:

  • 定义在它同目录下,同名的非Meta文件的唯一ID:GUID。而对于Unity的序列化文件来说,引用对象用的就是这个GUID。所以一旦Meta中的GUID变更了,就要注意,它很可能引起一场引用丢失的灾难(可以通过GUID找回)。
  • 存储资源文件的ImportSetting数据。在上文中资源文件是有ImportSetting数据的,这个数据正数存储在Meta文件中。ImportSetting中专门有存储Assetbundle相关的数据。这些数据帮助编辑器去搜集所有需要打包的文件并分门别类。所以每一次修改配置都会修改meta文件。

Meta文件详解——Unity GUID/ FileID/ InstanceID系统

——1.GUID:通过GUID就可以找到工程中的这个文件,无论它在项目的什么位置。在编辑器中使用AssetDatabase.GUIDToAssetPath和AssetDatabase.AssetPathToGUID进行互转。
——2.ImportSetting数据:由于这个数据的存在,把一个文件和这个文件的Meta文件从一个Unity工程复制到另一个Unity工程中,它的配置是不会变的。
——3.LocalID:对于一个文件下有多个文件的情况,就需要另外一个ID来表示,这就是LocalID。Meta文件中叫FileID。

  • 对于资源文件,非序列化文件,由于一般不会去更改源文件,所以FileID存储在meta文件中。例如Texture、Material、Animation等,这些文件每一类的LocalID都是一样的(例如所有的Texture2D的fileID都是2800000)。
  • 对于序列化文件(比如prefab、scene),自身数据里面会存储自身的FileID,也会记录所有子文件的FileID,各个Object的fileID都不相同,由Unity随机分配。

——4.InstanceID:该ID是运行时生成的,每个Object的InstanceID唯一,我们可以通过 Object.GetInstanceID 的API来获取。

一个Prefab中的GameObject组件:— !u!1 &5430584720211674993 (1表示Class ID,&后面的是LocalID)Unity通过GUID找到任何一个文件,通过LocalID找到其中的某个子文件。
如果打包的时候不希望引用某个资源,遍历所有的Asset,通过比较GUID,设置 {fileID: 0} 即可。

总结

在Unity中,一个Asset通常是由一个或多个对象构成。在序列化文件中,每个记录在&符号后面的数字都是一个Local ID,每一个Local ID也表示它将来也会被实例化成一个对象。也就是说,当一个prefab文件要实例化成一个GameObject时,它会自动尝试获取其内部Local ID所指的那个对象。如果这个所指的对象当前还没有被实例化出来,那么Unity会自动实例化这个对象,如此递归,直到所有涉及的对象都被实例化。已经完成实例化的对象会分配一个Instance ID。

参考文章

Unity文件、文件引用、Meta详解
Unity官方:AssetWorkflow
知乎-王江荣:【Unity】Asset简介
Understanding Unity’s serialization language, YAML

你可能感兴趣的:(Unity,unity,游戏引擎)