Unity文档阅读笔记(二)Asset Workflow

资产是你在Unity项目中用于创建游戏或应用的任何项目。资产可以代表项目中的视觉或音频元素,如3D模型、纹理、精灵、音效或音乐。资产还可以表示更抽象的项目,如颜色渐变、动画蒙版或任意文本或数字数据。资产可能来自于Unity之外创建的文件,如3D模型、音频文件或图像。你也可以在Unity编辑器中创建一些类型的资产,如ProBuilder Mesh, Animator Controller, Audio Mixer,或Render texture

Unity 中使用资源时的典型工作流程。每列代表一个单独的步骤,如下所述:

  • 将资源导入 Unity 编辑器

  • 使用 Unity 编辑器通过这些资源创建内容。

  • 构建您的应用或游戏文件,以及可选的随附内容包

  • 分发构建的文件,以便您的用户可以通过发布者或应用程序商店访问

  • 根据您用户的行为以及您对内容进行分组和捆绑的方式,在运行时根据需要加载进一步更新。

https://docs.unity3d.com/cn/current/Manual/AssetWorkflow.html

导入

若要将在 Unity 外部创建的资源导入 Unity 项目,可以将文件直接导出到项目下的 Assets 文件夹中,或将其复制到该文件夹中。对于许多常见格式,可以将源文件直接保存到项目的 Assets 文件夹中,Unity 可以读取它。Unity会检测到被更新的文件并重新导入。

资源导入设置

Unity 支持的每种类型的资源都有一组导入设置,这些设置会影响资源的显示或行为方式。要查看资源的导入设置,请在 Project 视图__中选择该资源。该资源的导入设置将显示在 Inspector__ 中。显示的选项因所选资源的类型而异。

例如,在 Unity 图像的导入设置中,可选择将其导入为纹理、2D 精灵还是法线贴图。在 FBX 文件的导入设置中,可调整比例、生成法线或光照贴图坐标以及拆分和修剪文件中定义的动画剪辑。

资源处理

Unity 读取并处理您添加到 Assets 文件夹的任何文件,将文件内容转换为可直接用于游戏的内部数据。资源文件本身保持不变,内部数据存储在项目的 Library 文件夹中。此数据是 Unity 编辑器的资源数据库的组成部分。

通过使用资源的内部格式,Unity 可以准备好可直接用于游戏的资源版本,以便在 Editor 中在运行时使用,同时将未修改的源文件保留在 Assets 文件夹中。使内部格式与资源文件分开,意味着您可以快速编辑它们并让 Editor 自动获取更改。例如,Photoshop 文件格式很方便,可以将 .psd 文件直接保存到 Assets 文件夹中,但移动设备和 PC 显卡等硬件不能直接处理该格式来渲染为纹理。

Unity 将资源的内部表示形式存储在 Library 文件夹中,该文件夹类似于缓存文件夹。作为用户,切勿手动更改 Library 文件夹,尝试这样做可能会给 Unity Editor 中的项目带来负面影响。但是,只要该项目未在 Unity 中打开,就可以安全删除 Library 文件夹,因为 Unity 可以通过 AssetsProjectSettings 文件夹重新生成其所有数据。这也意味着不应将 Library 文件夹纳入版本控制。

其他的复杂资源,如带有贴图或者动画的模型,或者音频视频的导入,可以看文档。

https://docs.unity3d.com/cn/current/Manual/ImportingAssets.html

支持的资源类型

https://docs.unity3d.com/cn/current/Manual/AssetTypes.html

https://docs.unity3d.com/2020.3/Documentation/Manual/BuiltInImporters.html

也可以通过Script-Importer自定义资源导入器

https://docs.unity3d.com/2020.3/Documentation/Manual/ScriptedImporters.html

资源的Metadata

https://docs.unity3d.com/2020.3/Documentation/Manual/AssetMetadata.html

资源数据库

对于大多数类型的资源,Unity 需要将资源的源文件中的数据转换为可用于游戏或实时应用程序的格式。这些转换后的文件及其关联的数据会存储在资源数据库 (Asset Database) 中。

由于大多数文件格式都经过优化来节省存储空间,所以需要执行转换过程,而在游戏或实时应用程序中,资源数据需要采用可用于硬件(例如 CPU、显卡或音频硬件)的格式才能立即使用。例如,Unity 将 .png 图像文件导入为纹理时,在运行时不会使用原始的 .png 格式数据。而在导入纹理时,Unity 将以另一种格式创建图像的新表示形式,并将其存储在项目的 Library 文件夹中。Unity 引擎中的 Texture 类会使用此导入版本,然后 Unity 将其上传到 GPU 以进行实时显示。

如果随后修改资源已导入的源文件(或更改其任何依赖项),Unity 会重新导入该文件并更新导入版本的数据。

资源缓存

资源缓存是 Unity 存储导入版本的资源的位置。由于 Unity 始终可以从源资源文件及其依赖项重新创建这些导入的版本,所以这些导入的版本被视为预先计算的数据的缓存。在使用 Unity 时,此缓存可节省时间。因此,应该从版本控制系统中排除资源缓存中的文件。

默认情况下,Unity 使用本地缓存,这意味着导入版本的资源将缓存在本地计算机上项目文件夹的 Library 文件夹中。应该使用 ignore file 从版本控制中排除此文件夹。

但是,如果您是团队成员并且使用版本控制系统,最好也使用 Unity Accelerator,它可以跨 LAN 共享资源缓存。

由于缓存的资源不适合存储在版本控制系统中,所以您的团队共同处理项目并使用本地缓存时,如果资源或依赖项发生改变,则每个团队成员的 Unity 副本都将执行导入过程,这可能会很耗时。

Unity 为此提供的解决方案称为 Unity Accelerator。Accelerator 的功能之一是软件代理,它存储缓存版本的资源并将其提供给同一本地网络上共同从事同一项目的每个人。这意味着只有一个团队成员需要导入任何给定资源。随后,导入版本的资源将存储在 Accelerator 中,其他团队成员可以下载缓存的版本,而不必在本地等待导入过程。

https://docs.unity3d.com/cn/current/Manual/AssetDatabaseRefreshing.html

https://docs.unity3d.com/cn/current/Manual/AssetDatabaseBatching.html

特殊的文件夹名

https://docs.unity3d.com/cn/current/Manual/SpecialFolders.html

预设

可以将组件中某些Component的设置保存下来,然后应用到后面需要的Component中

https://docs.unity3d.com/cn/current/Manual/Presets.html

Asset Bundle

AssetBundle 是一个存档文件,包含可在运行时由 Unity 加载的特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)。AssetBundle 可以表示彼此之间的依赖关系;例如,一个 AssetBundle 中的材质可以引用另一个 AssetBundle 中的纹理。为了提高通过网络传输的效率,可以根据用例要求(LZMA 和 LZ4)选用内置算法选择来压缩 AssetBundle。

AssetBundle 可用于可下载内容(DLC),减小初始安装大小,加载针对最终用户平台优化的资源,以及减轻运行时内存压力。

注意: AssetBundle 可以包含代码对象实例的序列化数据,例如 ScriptableObject。但是,类定义本身被编译为项目程序集之一。当您在 AssetBundle 中加载序列化对象时,Unity 会找到匹配的类定义,创建它的实例,并使用序列化值设置该实例的字段。这意味着您可以在 AssetBundle 中向游戏中引入的新项,只要这些项不需要对您的类定义进行任何更改。

https://docs.unity3d.com/cn/current/Manual/AssetBundles-Workflow.html

脚本与资源

https://docs.unity3d.com/cn/current/Manual/LoadingResourcesatRuntime.html

流媒体资源

Unity 在构建项目时将大多数资源整合到项目中。但是,将文件放入目标计算机上的普通文件系统以使其可通过路径名访问有时会很有用。这方面的一个例子是在 iOS 设备上部署电影文件;原始电影文件必须位于文件系统中的某个位置以便由 PlayMovie 函数进行播放。

Unity 会将放置在 Unity 项目中名为 StreamingAssets__(区分大小写)的文件夹中的所有文件逐字复制到目标计算机上的特定文件夹。要获取此文件夹,请使用 Application.streamingAssetsPath 属性。在任何情况下,最好使用 **Application.streamingAssetsPath** 来获取 StreamingAssets__ 文件夹的位置,因为它总是指向运行应用程序的平台上的正确位置。