Unity的文件与资产

一、Unity的文件夹

当我们创建一个项目时,有几个默认的文件夹也会随之创建,而且这些文件夹都在Unity中有着不可或缺的作用,以下就是刚创建的4个目录(Asset、Library、Package、ProjectSettings):

1.1 Assets

  1. Assets的作用: 存放资源的根目录,也是打开Unity工程最一个目录,他的作用是给开发者用来组织管理游戏所需要的各种资源,例如脚本、模型、材质,贴图、音频、脚本等.
  2. Assets的资源产生方式:
    • 第三方工具生成的资源:这些资源通常由第三方工具(Maya、3ds Max、Ps等)生成,然后导入到Unity中 使用,例如:FBX、纹理、声音等
    • Unity自己生成的资源: 例如Prefabs、Scenes、Animator文件等
  3. Assets的资源管理: Unity编辑器中的Asset文件夹中提供了许多的API,用于管理和操作项目中的资源.以下是常见的Assets文件操作的API:
    • AssetDataBase.CreateAsset: 在指定路径下创建新资源
    • AssetDataBase.GetDependencies: 获取给定路径下资源的所有依赖项
    • AssetDatabase.SaveAssets:将所有未保存的资源更改写入磁盘
    • AssetDatabase.Refresh :导入所有更改的资源。这将确保资源数据库中的信息与磁盘上的实际文件同步.
    • AssetDatabase是Unity编辑器中用于访问资源并执行操作的重要接口,可以使用这些API来管理项目中的资源,包括创建、删除、导入、移动和保存资源等. AssetDatabase的API: Unity官方AssetDatabase的API

1.2 Library

  1. Library的作用: 主要用于存储Unity项目的内部数据和资源.

    • 它包含了Unity编辑器需要的所有内部数据,以及会将Assets的资源导入成Unity可识别的格式,如PS的.psd文件可以转换为在移动设备和PC显卡上渲染的纹理.
    • 它类似一个缓存的文件夹,当删除Assets的图片和资源音频时,并不会自动删除,而是保留在Library文件夹中.
  2. Library的常见文件夹:

    • PackageCache: 用于缓存项目中的Package文件中的数据
    • ScriptAssemblies: DLL文件,将Assets的代码编译为DLL文件储存
    • ShaderCache:该文件夹用于存储已编译的着色器程序

1.3 Packages

  • Packages的作用: Package包配置信息,Unity会根据配置生成相应的数据,它用于放置一些官方组件和第三方插件.
  • Package的重要文件:
    • manifest.json: 描述了项目中所用到的所有包及其版本信息的文件
    • packages-lock.json: 锁定文件,用于记录项目中所有包的确切信息,以确保在不同的环境或团队成员间的一致性.

1.4 ProjectSettings

ProjectSettings的作用: 当前Unity工程下的各项设置参数记录.

文件名称 中文对照
AudioManager 音频管理器
TimeManager 事件管理器
GraphicsSettings 图像设置
InputManager 输入管理器
EditorSettings 编辑器设置
ProjectSettings 项目设置
QualitySettings 特性设置
UserSettings 用户的构建设置

1.5 特殊文件夹:

  • Editor: 用于存放编辑器脚本的文件夹,这些编辑器脚本用于扩展Unity编辑器,可以用来创建自定义的Inspector面板,编辑器窗口等,这些脚本在游戏构建时不会被打包成DLL放到游戏项目工程中.
  • Resources:存在资源的特殊文件夹.所有资源可以用Unity的API(Resources的API)查找和访问.构建游戏项目时,会将整个文件的资源添加到项目中,Resources中全部资源会被打包成一个缺省的AssetBundle(resources.assets) .
  • Plugins: 这个文件夹用于扩展 Unity 的功能。 通常存放DLL文件、C++文件、C文件等。它们可以访问第三方代码库、系统调用和SDK等。
  • StreamingAssets: 用于存放资源,该文件夹在打包的时候资源不会被压缩或加密,会原封不动的复制到项目的特定文件夹中,一般用来存放AssetBundle资源以及一些音效、网络等配置.

二、Unity资产

2.1 什么是Unity资产

Assets文件中的资源就是资产,资源文件一般分为两种类型,一种是Unity原生支持的格式,例如Prefabs、材质球、Scene等。另一种则是需要Unity在导入的时候处理过才能支持的文件,如FBX、纹理、mp3等.
Unity在导入资源时有各种导入器(Importer).所有的资源都会放在Assets文件夹下,然后经过Unity处理后会缓存在Libaray文件夹下.

2.2 Asset和Objects

  • Asset: Unity的资源,也可以指Projects窗口中所看到的单个文件或文件夹.

  • Object: UnityEngine.Object继承的对象,其实是一个可以序列化的数据,用来描述特定的资源实例,它也可以代表所有Unity引擎所支持的类型,如Mesh,Sprite,AudioClip(class类)等.

  • Asset和Objects的区别: Asset和Objects是一种一对多的关系,例如一个Prefab(Asset) 里面包含许多Text、Button、GameObject、Image(Object)等.

2.3 File GUIDS、Local IDS、InstanceID

  • Meta文件: 每次创建或者导入一个资源时,Unity会同时创建同名的Meta文件,而这个Meta文件就是Unity用来资源管理的重要文件之一. 它的本质是文本文档,它采用的是YAML格式来写的.Unity的序列化文件(.asset、.meta和.prefab)都是用这个格式类写的,如Prefab、场景等等.
  • FileGUIDS(简称GUID): Guid是Meta中最最最重要的数据.Guid就表示这个文件(.meta),也就是同名资源的唯一ID.通过Guid就可以找到工程中的资源文件,在编辑器中经常使用AssetDatabase.GUIDToAssetPathAssetDatabase.AssetPathToGUID进行互转.
  • LocalIDS(又称fileID):GUID对应一个文件,一个文件中可能会包含多个文件,这个时候就需要另外一个ID来表示,这就是FileID.FileID的储存方式有2种:

    • 非序列化文件(如FBX文件): FileID直接存储在meta文件中.

    • 序列化文件(.prefab、.asset):FileID存储在自身数据中.

  • InstanceID: GUID和fileID能够使Unity在编辑器模式下快速完成Unity的资源管理,但是在运行时,则会存在比较大的性能问题,运行时需要一个表示更好的系统,于是Unity就弄了一套缓存系统(PersistentManager),将GUID和fileID转换为一个简单且唯一的整数.从文件加载的对象将被分配一个正数的InstanceID,新创建的对象将具有负数的InstanceID,即使稍后将对象保存到文件中,其负值也会保持不变。
字段 图片
GUID
LocalID
InstanceID

三、资源的生命周期

3.1 Object加载

  • 当Unity的应用程序启动时,PersistentManager的缓存系统会对项目立刻要用到的数据(比如启动场景里的Object和依赖项)以及Resource目录下的Object进行初始化.如果在运行时导入了Asset或从AssetBundles加载了Object都会参数新的InstanceID.

  • Object会自动加载的情况:

    • 某个Object的InstanceID被间接的引用了.
    • Object当前没有加载到内存中
    • 可以定位到Object的源位置(File GUID和LoaclID)
  • 资源加载错误: 如果File GUID和LocalID没有InstanceID, 或者有InstanceID,但是对应的Object已经被卸载了,并且Instance ID引用了无效的FileGUID和LocalID,那么这个Objects的引用会被保留,但是实际Objects不会被加载。在Unity的编辑器里会显示为:“(Missing)”引用,而在运行时,根据Objects类型不一样,有可能会是空指针,有可能会丢失网格或者纹理贴图导致场景或者物体显示粉红色.

3.2 Object卸载

// TODO: AssetBundle和Resource的卸载