Unity文件、META文件、Prefab文件

文件打开乱码解决方式

如果你的文件打开是乱码,只需要在Unity中将资源序列化选择为ForceText即可,具体操作方式如下:

  1. 在Unity界面左上角找到Edit,再点击后的出现的列表中选择项目设置
  2. 在这里插入图片描述

Unity文件都有什么?

  • 资源文件
  • 代码文件
  • 序列化文件
  • 非序列化文件
  • 文本文件
  • META文件

资源文件

资源文件是指一些创建好的、不需修改的文件。如FBX文件、音频文件、贴图文件、视频文件、动画文件(动画文件虽然被认为是配置文件,但是我们一般不回去修改它,所以也可以认为是资源文件)。资源文件在导入Unity的时候都会进行转化,每一个类型都对应一个AssetImporter,如AudioImporter、TextureImporter、ModelImporter等,在Unity中点击这类资源,在Inspector面板会出现设置界面,如下图为音频文件的设置界面。
在这里插入图片描述

代码文件

代码文件包括所有的代码文件、代码库文件、Shader文件等,在导入的时候,Unity会进行依次编译

序列化文件

序列化文件指能够序列化的文件,如Unity自身的一些类型:Prefab文件、场景文件、Asset文件(ScriptableObject)、Mat文件(材质球),这些文件在运行时可以直接反序列化为对应类的一个实例。

Prefab文件

Prefab文件的内容是通过YAML语言序列化的一个GameObject的对象,其中包含GameObject的所有描述信息,如GameObject信息,Component实例和属性等。

接下来我们结合Cube的Prefab分析Prefab文件具体都存储了什么数据。

首先我们将一个Cube制作成预制体,并命名为Prefab,找到该预制体的文件位置,打开后缀为**.Prefab**的文件,可以使用记事本或者VS等软件打开。

%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1242430040932248662
GameObject:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {
    
    fileID: 0}
  m_PrefabInstance: {
    
    fileID: 0}
  m_PrefabAsset: {
    
    fileID: 0}
  serializedVersion: 6
  m_Component:
  - component: {
    
    fileID: 1242430040932248658}
  - component: {
    
    fileID: 1242430040932248659}
  - component: {
    
    fileID: 1242430040932248656}
  - component: {
    
    fileID: 1242430040932248657}
  m_Layer: 0
  m_Name: Prefab
  m_TagString: Untagged
  m_Icon: {
    
    fileID: 0}
  m_NavMeshLayer: 0
  m_StaticEditorFlags: 0
  m_IsActive: 1
--- !u!4 &1242430040932248658
Transform:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {
    
    fileID: 0}
  m_PrefabInstance: {
    
    fileID: 0}
  m_PrefabAsset: {
    
    fileID: 0}
  m_GameObject: {
    
    fileID: 1242430040932248662}
  m_LocalRotation: {
    
    x: 0, y: 0, z: 0, w: 1}
  m_LocalPosition: {
    
    x: 2.696, y: -0.09169984, z: -0.08227718}
  m_LocalScale: {
    
    x: 1, y: 1, z: 1}
  m_Children: []
  m_Father: {
    
    fileID: 0}
  m_RootOrder: 0
  m_LocalEulerAnglesHint: {
    
    x: 0, y: 0, z: 0}
--- !u!33 &1242430040932248659
MeshFilter:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {
    
    fileID: 0}
  m_PrefabInstance: {
    
    fileID: 0}
  m_PrefabAsset: {
    
    fileID: 0}
  m_GameObject: {
    
    fileID: 1242430040932248662}
  m_Mesh: {
    
    fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &1242430040932248656
MeshRenderer:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {
    
    fileID: 0}
  m_PrefabInstance: {
    
    fileID: 0}
  m_PrefabAsset: {
    
    fileID: 0}
  m_GameObject: {
    
    fileID: 1242430040932248662}
  m_Enabled: 1
  m_CastShadows: 1
  m_ReceiveShadows: 1
  m_DynamicOccludee: 1
  m_MotionVectors: 1
  m_LightProbeUsage: 1
  m_ReflectionProbeUsage: 1
  m_RayTracingMode: 2
  m_RenderingLayerMask: 1
  m_RendererPriority: 0
  m_Materials:
  - {
    
    fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
  m_StaticBatchInfo:
    firstSubMesh: 0
    subMeshCount: 0
  m_StaticBatchRoot: {
    
    fileID: 0}
  m_ProbeAnchor: {
    
    fileID: 0}
  m_LightProbeVolumeOverride: {
    
    fileID: 0}
  m_ScaleInLightmap: 1
  m_ReceiveGI: 1
  m_PreserveUVs: 0
  m_IgnoreNormalsForChartDetection: 0
  m_ImportantGI: 0
  m_StitchLightmapSeams: 1
  m_SelectedEditorRenderState: 3
  m_MinimumChartSize: 4
  m_AutoUVMaxDistance: 0.5
  m_AutoUVMaxAngle: 89
  m_LightmapParameters: {
    
    fileID: 0}
  m_SortingLayerID: 0
  m_SortingLayer: 0
  m_SortingOrder: 0
--- !u!65 &1242430040932248657
BoxCollider:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {
    
    fileID: 0}
  m_PrefabInstance: {
    
    fileID: 0}
  m_PrefabAsset: {
    
    fileID: 0}
  m_GameObject: {
    
    fileID: 1242430040932248662}
  m_Material: {
    
    fileID: 0}
  m_IsTrigger: 0
  m_Enabled: 1
  serializedVersion: 2
  m_Size: {
    
    x: 1, y: 1, z: 1}
  m_Center: {
    
    x: 0, y: 0, z: 0}
  1. 前两行是YAML的注释
  2. 从第三行到下一个出现 —!u! 开头的行之间是prefab中对象的描述信息
    每个元素的描述内容都以 —!u!n1 & n2 开头
    n1代表元素的类型ID(类型ID的具体含义可以参考YAML Class ID Reference),如GameObject的类型ID为1
    n2代表这个元素的本地ID,是该文件中唯一的对象ID号,尽管该数字是任意分配给每个对象的,创建出来就被赋值。
  3. 接下来的多行表示该元素(组件)的每个属性的值,属性通常以 m_ + 属性名,接下来我们从GameObject这个元素进行分析:
    • 第一行 — !u! 1 & 1242430040932248662中的信息是:类型ID为1、本地ID为1242430040932248662
    • 第二行为该类型的名称
    • m_CorrespondingSourceObject、m_PrefabInstance、m_PrefabAsset三个参数在该prefab实例化的时候才会被赋值使用,正常情况下为0。将Cube拖入到场景中放在Main Camera下面,我们结合场景(.unity)文件,我们会找到下面所示的数据
      (注:其他行的数据可以将前面的 m_ 前缀去掉,剩下的字段分别对应组件的配置参数)
--- !u!1001 &44325156
PrefabInstance:
  m_ObjectHideFlags: 0
  serializedVersion: 2
  m_Modification:
    m_TransformParent: {
    
    fileID: 963194228}
    m_Modifications:
    - target: {
    
    fileID: 1242430040932248658, guid: 4056222df4abff6438d3de39dea17010,
        type: 3}
      propertyPath: m_RootOrder
      value: 0
      objectReference: {
    
    fileID: 0}
    - target: {
    
    fileID: 1242430040932248658, guid: 4056222df4abff6438d3de39dea17010,
        type: 3}
      propertyPath: m_LocalPosition.x
      value: 2.696
      objectReference: {
    
    fileID: 0}
    - target: {
    
    fileID: 1242430040932248658, guid: 4056222df4abff6438d3de39dea17010,
        type: 3}
      propertyPath: m_LocalPosition.y
      value: -0.09169984
      objectReference: {
    
    fileID: 0}
    - target: {
    
    fileID: 1242430040932248658, guid: 4056222df4abff6438d3de39dea17010,
        type: 3}
      propertyPath: m_LocalPosition.z
      value: -0.08227718
      objectReference: {
    
    fileID: 0}
    - target: {
    
    fileID: 1242430040932248658, guid: 4056222df4abff6438d3de39dea17010,
        type: 3}
      propertyPath: m_LocalRotation.w
      value: 1
      objectReference: {
    
    fileID: 0}
    - target: {
    
    fileID: 1242430040932248658, guid: 4056222df4abff6438d3de39dea17010,
        type: 3}
      propertyPath: m_LocalRotation.x
      value: 0
      objectReference: {
    
    fileID: 0}
    - target: {
    
    fileID: 1242430040932248658, guid: 4056222df4abff6438d3de39dea17010,
        type: 3}
      propertyPath: m_LocalRotation.y
      value: 0
      objectReference: {
    
    fileID: 0}
    - target: {
    
    fileID: 1242430040932248658, guid: 4056222df4abff6438d3de39dea17010,
        type: 3}
      propertyPath: m_LocalRotation.z
      value: 0
      objectReference: {
    
    fileID: 0}
    - target: {
    
    fileID: 1242430040932248658, guid: 4056222df4abff6438d3de39dea17010,
        type: 3}
      propertyPath: m_LocalEulerAnglesHint.x
      value: 0
      objectReference: {
    
    fileID: 0}
    - target: {
    
    fileID: 1242430040932248658, guid: 4056222df4abff6438d3de39dea17010,
        type: 3}
      propertyPath: m_LocalEulerAnglesHint.y
      value: 0
      objectReference: {
    
    fileID: 0}
    - target: {
    
    fileID: 1242430040932248658, guid: 4056222df4abff6438d3de39dea17010,
        type: 3}
      propertyPath: m_LocalEulerAnglesHint.z
      value: 0
      objectReference: {
    
    fileID: 0}
    - target: {
    
    fileID: 1242430040932248662, guid: 4056222df4abff6438d3de39dea17010,
        type: 3}
      propertyPath: m_Name
      value: Prefab
      objectReference: {
    
    fileID: 0}
    m_RemovedComponents: []
  m_SourcePrefab: {
    
    fileID: 100100000, guid: 4056222df4abff6438d3de39dea17010, type: 3}
--- !u!4 &44325157 stripped
Transform:
  m_CorrespondingSourceObject: {
    
    fileID: 1242430040932248658, guid: 4056222df4abff6438d3de39dea17010,
    type: 3}
  m_PrefabInstance: {
    
    fileID: 44325156}
  m_PrefabAsset: {
    
    fileID: 0}

其中PrefabInstance里面的数据表示预制体实例的数据

m_ObjectHideFlags表示该预制体是否隐藏,0表示不隐藏。如果隐藏了不单单是在场景和游戏面板看不见预制体,在层级面板也不显示该预制体的名称

serializedVersion表示序列化版本

m_TransformParent表示该预制体的父对象的Transform组件的本地ID

m_Modifications中存储的数据有预制体的本地坐标和预制体修改的数据,如我们禁用Box Collider,场景文件中就会出现下面一串代码

    - target: {
    
    fileID: 1242430040932248657, guid: 4056222df4abff6438d3de39dea17010,
        type: 3}
      propertyPath: m_Enabled
      value: 0
      objectReference: {
    
    fileID: 0}
fileID对应修改的组件的本地ID
guid对应META文件中的guid,guid具体用处稍后再讲
type表示类型
propertyPath表示修改的参数名称
value表示修改之后的参数值
objectReference表示对象引用

m_CorrespondingSourceObject字段存储的是预制体的FileID和GUID,其中FIleID是预制体的Transform组件的FileID
m_PrefabInstance字段存储的是实例对象的FileID
m_PrefabAsset字段存储实例对象资源的FileID

非序列化文件

非序列化文件是Unity无法识别的文件,比如文件夹也会被认为是一个文件,但是无法识别。

文本文件

文本文件比较特殊,它不属于序列化文件,但是可以被是识别为TextAsset。很像资源文件,但是又不需要资源文件需要进行设置和转化。如txt、xml文件等。

META文件

META文件采用YAML格式
META文件的作用:

  • 定义同目录下,同名的非META文件的唯一ID:GUID。对于序列化文件来说,引用的对象就是这个GUID,所以一旦META文件中的GUID被修改,那么很可能会造成一场引用丢失的灾难。
  • 存储资源文件的ImportSetting数据。ImportSetting中专门有存储AssetBundle相关的数据,这些数据帮助编译器搜集所有需要打包的文件并分门别类。每一次修改配置都会修改META文件。

Unity GUID / FileID

GUID

GUID是META文件中最重要的数据,可以说GUID就代表了这个文件,只要知道GUID,就可以在工程中找到这个文件。在编译器中可以使用 AssetDatabase.GUIDToAssetPath 和 AssetDatabase.AssetPathToGUID进行切换。

ImportSetting数据

第二重要的就是要保存的ImportSetting数据了,对于不同的资源文件,生成的ImportSetting也不一样。如上面说的AudioImporter、TextureImporter、ModelImporter等。根据数据和Inspector面板中的配置参数,就可以看懂每一行的含义了,此处不做详细讲解。

FileID(LocalID)

对于如图集这样的文件,一个图集中有多个图片,也就是一个文件中含有多个子文件,那么如何使用GUID来对应一个文件呢?此时,就顺理成章引入了LocalID,又称之为FileID。

FileID存储在META文件中,表示对子文件的引用,如下图可以在fileIDToRecycleName下方找到FileID跟资源命名一一对应:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44081533/article/details/115890743