unity中的.prefab文件
在Unity中,.prefab
文件是一种特殊的资源类型,它记录了预制件(Prefab)的定义和配置。预制件是Unity中的一种机制,允许开发者创建可重复使用的游戏对象模板。.prefab
文件并不直接记录具体的资源内容,而是记录了文件关联的资源路径和对象之间的关系。以下是.prefab
文件的主要内容和作用:
1. 对象结构
- 对象树:
.prefab
文件记录了预制件中所有游戏对象的层次结构和父子关系。 - 组件信息:每个游戏对象上的组件(如
Transform
、MeshFilter
、Renderer
等)及其属性都会被记录在.prefab
文件中。
2. 资源引用
- 资源路径:
.prefab
文件中包含了对外部资源的引用,例如纹理、材质、音频文件等。这些引用通常是以资源的GUID或相对路径的形式存储的。 - 动态加载:当预制件被实例化时,Unity会根据这些引用来动态加载所需的资源。
3. 默认值和属性
- 默认属性值:
.prefab
文件记录了预制件中各个组件的默认属性值。 - 可编辑区域:预制件中的某些属性可以被标记为可编辑的,这样在使用预制件时可以修改这些属性而不影响原始的
.prefab
文件。
4. 版本控制信息
- GUID:每个
.prefab
文件都有一个全局唯一标识符(GUID),Unity使用这个GUID来管理和引用预制件。 - 依赖关系:
.prefab
文件可能包含对该.prefab
文件所依赖的其他资源的引用信息。
5. 自定义编辑器数据
- 自定义数据:开发者可以在
.prefab
文件中存储自定义的编辑器数据,这些数据仅在Unity编辑器中使用,不会影响运行时的行为。
示例
假设你有一个包含MeshFilter
和Renderer
组件的立方体预制件:
.prefab
文件会记录这个立方体的对象结构和组件信息。- 如果立方体使用了特定的纹理,
.prefab
文件会记录这个纹理的引用路径。 - 当你在场景中实例化这个预制件时,Unity会根据
.prefab
文件中的引用路径动态加载纹理。
结语
.prefab
文件在Unity中起到了模板的作用,它记录了预制件的结构和对外部资源的引用,而不是直接记录具体的资源内容。这种设计使得预制件可以在不同的场景中重复使用,并且能够灵活地适应不同的资源变化。开发者可以通过Unity编辑器直观地编辑.prefab
文件,从而实现对游戏对象模板的精细控制。
首先资源是什么
要弄明白什么是“资源”,它与我们Prefab、GameObject、Component有什么区别?
Prefab是一个记录了资源组织关系的文本文件。你可以直接用记事本打开prefab文件,
图中的prefab,左图表示这个GameObject名为AIPawnActor,其上挂了4个组件。其中一个组件为Transform(YAML ClassID = 4);右图表示这个GameObject上的MeshRenderer组件(YAML ClassID = 23),引用了一个GUID为a68b0439d20bbff46a0d63da01cb3362的材质。prefab中并不保存实际的资源,而是根据FileID、GUID,建立了prefab内外的索引关系
当通过Resources.Load、AssetBundle.LoadAsset读取prefab文件时,引擎会根据组织关系展开prefab,加载关联资源。
GameObject、Component是Unity通过“在C++定义、给C#暴露接口”的形式,封装了某些功能的接口。他们索引了资源,但他们本身不是资源。例如Transform记录了Position、Rotation、Scale信息;MeshRenderer负责从MeshFilter、Material中获得需要的模型、材质数据,告诉Unity该如何渲染。但是,它们并不是“资源”,而是间接引用了资源。
Texture、Mesh、Shader、Material、AnimatorController、AnimationClip等,它们保存了实际的数据,也可以从文件系统中读取、保存到文件。这些是真正意义上的“资源”(Assets)。
其次,要弄明白Unity的序列化中的几个概念:“GUID”、“Local ID”、“ Instance ID”。
File GUID:资源第一次被导入Assets目录内(以下称“工程内”),Unity自动为其分配的一个文件唯一ID,记录在.meta文件中。File GUID设计的初衷,是让引擎的资源管理,可以忽略文件路径的变化。当贴图挪动位置时,引用它的材质球不需要同步地修改。
Local ID:同一个文件内,多个UnityEngine.Object(以下称“Object”)的文件内唯一ID。如一个Prefab,可能存在多个子GameObject节点、多个Component。这些Object在Prefab中通过Local ID进行索引。
Instance ID:运行时为每个Object生成的Int32索引,本次运行期间唯一。对于Resources下的资源、直接打进包内的场景,Instance ID将在游戏启动时创建;对于AssetBundle内的资源,Instance ID将在加载Object时创建。运行时的比较、加载、操作,都将以Instance ID为Key。只有需要加载时,才使用File GUID + Local ID去查找、加载资源。
评论记录:
回复评论: