Unity3D:自定义资产数据库工作流

Unity3D:自定义资产数据库工作流
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

自定义资产数据库工作流

使用 AssetDatabase 类自定义资产管线,并创建工具来使用您自己的管线访问、加载、创建和操作资产脚本
,以扩展编辑器的工作方式。它是一个编辑器类,因此其功能在运行时在独立构建中不可用。

自定义您的资产工作流程

AssetDatabase 类具有大量方法,允许您以与 Unity 编辑器本身完全相同的方式访问资源并对其执行操作。您可以创建、导入、删除、复制、移动、加载和保存资产,以及搜索资产数据库。

这意味着您可以使用 Unity 的编辑器脚本和编辑器窗口自定义来创建从简单调整到强大工具以及项目资源工作流程的自定义的任何内容。

有关一个简单的示例,请参阅 AssetDatabase.ForceReserializeAssets 方法的文档。它展示了如何将菜单项添加到编辑器中,以便更好地控制在将项目升级到较新版本的 Unity 时应如何升级某些资源包。

有关可用方法的完整列表以及每个方法的文档,请参阅资产数据库脚本 API 页面。

资产对象

从脚本的角度来看,Unity 认为的“资产”与您在项目窗口
.放置在项目的“资源”文件夹中的文件是资源的源文件,但它们在概念上与 Unity 编辑器使用的资源对象不同。当 Unity 导入资源文件时,它会处理它们并生成导入的结果:派生自 UnityEngine.Object 的序列化 C# 对象。从脚本的角度来看,在 Unity 编辑器中编写脚本时您有权访问的资产就是这些导入的结果。

例如,可能以二进制文件开头的资产(如 JPEG 或 PNG 图像文件)将转换为 C# 对象,其类型是 UnityEngine.Object 的专用化。对于 JPEG 或 PNG 文件,它们将转换为质地
类,而它又继承自 UnityEngine.Object。然后,序列化的对象数据将作为项目存储在 Library 文件夹中。因此,当您使用脚本访问纹理资源时,您访问的不是原始 JPEG 或 PNG 文件,而是在访问导入原始图像文件时生成的 C# 纹理对象的序列化版本。Unity 在导入过程中创建的 .meta 文件存储在原始资源文件旁边,其中包含资源的导入设置,并包含一个 GUID,允许 Unity 将原始资源文件与资源数据库中的项目连接起来。

导入资源时,Unity 会在“资源”文件夹中创建一个 .meta 文件,在“资源”文件夹中创建一个工件文件
导入资源时,Unity 会在“资源”文件夹中创建一个 .meta 文件,在“资源”文件夹中创建一个工件文件

内部资产文件和工件文件

Unity 自己创建的某些类型的资源文件,例如.预 置
,.现场
.asset.mat 已在其源文件中包含序列化数据,因此 Unity 生成和缓存的项目文件与源文件非常相似。这些文件的源文件(例如项目“资源”文件夹中的 .mat 材质文件)是人类可读的(前提是“资源序列化模式”设置为“强制文本”,这是默认设置)。这与从外部源(如纹理或音频)导入的二进制资产文件形成鲜明对比,在外部源中,文件通常不是人类可读的。

资产文件可以包含多个序列化对象,为了使用 AssetDatabase 方法编写脚本,可以将每个对象视为“资产”。例如,.prefab 资产文件可能包含序列化的游戏对象
连接了多个组件。其中每个组件也序列化为资产文件中的对象,因此在使用 AssetDatabase 方法访问预制件资产的内容时,资产文件中的组件对象被视为子资产(下面将更详细地解释)。

在导入过程中生成的序列化对象称为工件,Unity 将它们存储在资源数据库的导入工件缓存中,位于项目的 Library 文件夹中。它们被视为缓存数据,因为 Unity 始终可以使用导入器设置和项目设置
保存在您的项目中。

您可以使用“导入活动”窗口检查为项目中的资源生成的工件,该窗口会显示 Unity 生成的特定缓存工件文件,以及其他有用信息,例如导入发生的时间和花费的时间。

每个项目文件名都是没有文件扩展名的唯一哈希(GUID)。Unity 将这些文件分隔到子文件夹中,每个子文件夹的名称与工件文件名的前两个字符匹配。

这些工件文件包含二进制数据,并且不是设计为人类可读的。虽然了解这些文件包含资源数据库使用的数据很有用,但在使用 Unity 时,您无需直接查看、编辑或使用这些文件。相反,类提供了在编辑器中处理资产所需的方法。

主要资产和子资产

由于 Unity 可以在同一资源文件中存储多个序列化对象,因此 Unity 具有任何资源文件中主资源的概念。当 Unity 创建包含单个资源(例如材质)的资源文件时,主资源始终是该单个资源。对于包含多个序列化资产对象的其他类型,除非使用 SetMainObject 方法另行指定,否则主资产始终是添加到文件的第一个资产。

您有时可以在编辑器的“项目”窗口中看到子资源(如果这些子资源属于某些类型)。例如,在“项目”窗口中查看此包含“太空护卫舰”模型的FBX资源文件,其视图已展开,显示它具有材质和网孔
作为子资产。

“项目”窗口中的 FBX 资源文件,显示两个子资源:材质和网格
“项目”窗口中的 FBX 资源文件,显示两个子资源:材质和网格

资源还可以具有未像这样显示在“项目”窗口中的子资源类型。例如,上面的“太空护卫舰”资源文件实际上包含的项目窗口中显示的两个子资源。当您使用 AssetDatabase 方法访问资产文件时,您可以看到资产的实际数量,如下面的脚本所示:

using UnityEngine;
using UnityEditor;

public class Example : MonoBehaviour
{
    [MenuItem("AssetDatabase/InspectAssets")]

    private static void InspectAssets()
    {
        Object[] data = AssetDatabase.LoadAllAssetsAtPath("Assets/Space Frigate.fbx");

        Debug.Log(data.Length + " Assets");
        foreach (Object o in data)
        {
            Debug.Log(o);
        }
    }
}

在这种情况下,输出将显示此文件的导入序列化版本包含六个资产:

6 Assets
Space Frigate (UnityEngine.GameObject)
space_frigate_0 (UnityEngine.Material)
space_frigate_0 (UnityEngine.Mesh)
Space Frigate (UnityEngine.Transform)
Space Frigate (UnityEngine.MeshRenderer)
Space Frigate (UnityEngine.MeshFilter)

这是因为游戏对象、材质、网格数据本身以及 Unity 在导入过程中自动添加到游戏对象的每个组件(变换、网格过滤器和网格渲染器)都算作单独的序列化对象。因此,它们是资产文件的子资产,就资产数据库 API 而言,每个都是单独的资产。

资产导入订单

如果使用 AssetDatabase 类编写脚本,请务必了解 Unity 导入过程的顺序如何影响脚本,否则可能会得到意外结果。顺序如下:

  1. 导入脚本资源(.cs、.dll、.asmdef 文件)
  2. 汇编
  3. 域名重新加载
  4. 初始化加载回调
  5. 导入所有其他资源

脚本始终在所有其他常规资源之前导入和编译,因为编辑器需要知道项目中是否存在自定义资源后处理器或脚本导入器。这可确保编辑器在导入其余非脚本资源时使用任何新的或更改的导入器或后处理器。

InitializeOnLoad 回调通常用于在项目启动或脚本更改时运行一些代码。如上面的列表所示,此回调在 Unity 重新加载域之后,但在开始导入资源之前运行。这意味着,如果使用 [InitializeOnLoad] 回调访问资产,则代码将在当前资产导入周期完成之前执行。特别:

  • 对于首次导入的资产,例如AssetDatabase.LoadAssetAtPath, AssetDatabase.FindAssets,着色
    .查找,资源.加载将返回 null,因为这些资产尚未导入。
  • 对于至少导入过一次的资产,如果资产在重新加载域之前进行了修改,则 AssetDatabase.Load.Load、AssetDatabase.FindAssets、Shader.Find、Resources.Load 等方法将返回资产的先前(过时)版本,因为域重新加载发生在常规资产导入阶段之前。

编写脚本化导入程序、资产预处理器和资产后处理器时,不应使代码假定其他特定资产已根据任何特定顺序导入。导入时,Unity 会按类型将资源分组到队列中,当类型按预定义顺序导入时,相同类型的队列中的资源将以任意顺序导入,除非您使用 ScriptedImporter.GatherDependenciesFromSourceFile。“使用”还会在资产之间创建依赖关系,因此,如果修改了一个资产,则会重新导入依赖于它的另一个资产。GatherDependenciesFromSourceFile

此文由3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D:刷新资源数据库 (mvrlink.com)

下一篇:Unity3D:AssetDatabase 批处理 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号