版本:Unity 6 (6000.0)
语言:英语
资源元数据
刷新资源数据库

资源数据库

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

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

如果您随后修改了已导入的资源的源文件(或更改了它的任何依赖项),Unity 将重新导入文件并更新导入的数据版本。有关此过程的更多信息,请参见 刷新资源数据库

资源数据库还提供了一个 AssetDatabase API,您可以使用它来访问资源,并控制或自定义导入过程。

资源导入依赖项

资源数据库跟踪每个资源的所有 依赖项,并保存所有资源的导入版本的缓存。

资源的导入依赖项包括所有可能影响导入数据的数据。例如,资源的源文件是一个依赖项,以及资源的导入设置(例如纹理的压缩类型),或项目的目标平台(例如,PS4 硬件需要与 Android 硬件不同的格式数据)。如果您修改了这些依赖项中的任何一项,导入的资源的缓存版本将变为无效,Unity 必须重新导入它以反映更改。

资源缓存

资源缓存是 Unity 存储资源的导入版本的存储位置。由于 Unity 始终可以从源资源文件及其依赖项重新创建这些导入的版本,因此这些导入的版本被视为预先计算数据的缓存,这在您使用 Unity 时可以节省时间。因此,您应该将资源缓存中的文件排除在 版本控制一个管理文件更改的系统。您可以将 Unity 与大多数常见的版本控制工具结合使用,包括 Perforce、Git、Mercurial 和 PlasticSCM。 了解更多信息
术语表 中查看
系统之外。

默认情况下,Unity 使用本地缓存,这意味着资源的导入版本将缓存到本地机器上项目文件夹的 Library 文件夹中。您应该使用 忽略文件许多版本控制系统中使用的一种特殊文件,用于指定要从版本控制中排除的文件。在 Unity 项目中,有许多文件可以从版本控制中排除,使用忽略文件是实现此目的的最佳方法。
术语表 中查看
来将此文件夹排除在版本控制之外。

但是,如果您是团队成员并使用版本控制系统,那么使用 Unity Accelerator 可能会更有益,它可以在您的 LAN 上共享资源缓存。

由于缓存的资源不适合存储在版本控制系统中,因此当您的团队在项目上协同工作并使用本地缓存时,如果资源或依赖项发生变化,每个团队成员的 Unity 副本都会执行导入过程,这可能很费时。

Unity 为此提供了一个名为 Unity Accelerator 的解决方案。其中一个 加速器Unity Accelerator 是一个外部工具,它提供了一个资源缓存,其中保存了团队导入的资源副本。Accelerator 的目标是通过协调资源共享来加快团队合作速度并减少迭代时间,这样您就不需要重新导入项目的一部分。 了解更多信息
术语表 中查看
的功能是一个软件代理,它将资源的缓存版本存储并提供给在同一本地网络上协同处理同一项目的每个人。这意味着只需要一位团队成员导入任何给定的资源。然后,导入的资源版本将存储在 Accelerator 中,其他团队成员可以下载缓存的版本,而不是等待本地导入过程。

源资源和工件

Unity 在 Library 文件夹中维护两个数据库文件,它们共同称为资源数据库。这两个数据库跟踪有关您的源资源文件和工件的信息,工件是有关导入结果的信息。

源资源数据库

源资源数据库包含有关您的源资源文件的信息,Unity 使用这些信息来确定文件是否已被修改,因此是否应该重新导入文件。这包括信息,例如最后修改日期、文件内容的哈希值、GUID 和其他元数据。

工件数据库

工件是导入过程的结果。工件数据库包含有关每个源资源的导入结果的信息。每个工件包含导入依赖项信息、工件元数据和工件文件列表。

注意:数据库文件位于项目的 Library 文件夹中,因此您应该将它们排除在版本控制系统之外。您可以在以下位置找到它们

  • 源资源数据库:Library\SourceAssetDB
  • 工件数据库:Library\ArtifactDB

导入资源

Unity 通常会在将资源拖放到项目中时自动导入资源,但也可以在脚本控制下导入资源。为此,您可以使用 AssetDatabase.ImportAsset 方法,如下面的示例所示。

using UnityEngine;
using UnityEditor;

public class ImportAsset {
    [MenuItem ("AssetDatabase/ImportExample")]
    static void ImportExample ()
    {
        AssetDatabase.ImportAsset("Assets/Textures/texture.jpg", ImportAssetOptions.Default);
    }
}

您还可以将 AssetDatabase.ImportAssetOptions 类型的额外参数传递给 AssetDatabase.ImportAsset 调用。脚本参考页面记录了不同的选项及其对函数行为的影响。

加载资源

编辑器仅在需要时加载资源,例如将资源添加到 场景场景包含游戏环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,您放置环境、障碍物和装饰,基本上是设计和构建游戏的各个部分。 了解更多信息
术语表 中查看
或从 检查器一个 Unity 窗口,用于显示有关当前选定游戏对象、资源或项目设置的信息,允许您检查和编辑值。 了解更多信息
术语表 中查看
面板进行编辑。但是,您可以使用 AssetDatabase.LoadAssetAtPathAssetDatabase.LoadMainAssetAtPathAssetDatabase.LoadAllAssetRepresentationsAtPathAssetDatabase.LoadAllAssetsAtPath 从脚本中加载和访问资源。有关更多详细信息,请参见脚本文档。

using UnityEngine;
using UnityEditor;

public class ImportAsset {
    [MenuItem ("AssetDatabase/LoadAssetExample")]
    static void ImportExample ()
    {
        Texture2D t = AssetDatabase.LoadAssetAtPath("Assets/Textures/texture.jpg", typeof(Texture2D)) as Texture2D;
    }
}

使用 AssetDatabase 进行文件操作

由于 Unity 保留了资源文件的元数据,因此您不应使用文件系统创建、移动或删除这些文件。相反,您可以使用 AssetDatabase.ContainsAssetDatabase.CreateAssetAssetDatabase.CreateFolderAssetDatabase.RenameAssetAssetDatabase.CopyAssetAssetDatabase.MoveAssetAssetDatabase.MoveAssetToTrashAssetDatabase.DeleteAsset

public class AssetDatabaseIOExample {
    [MenuItem ("AssetDatabase/FileOperationsExample")]
    static void Example ()
    {
        string ret;
        
        // Create
        Material material = new Material (Shader.Find("Specular"));
        AssetDatabase.CreateAsset(material, "Assets/MyMaterial.mat");
        if(AssetDatabase.Contains(material))
            Debug.Log("Material asset created");
        
        // Rename
        ret = AssetDatabase.RenameAsset("Assets/MyMaterial.mat", "MyMaterialNew");
        if(ret == "")
            Debug.Log("Material asset renamed to MyMaterialNew");
        else
            Debug.Log(ret);
        
        // Create a Folder
        ret = AssetDatabase.CreateFolder("Assets", "NewFolder");
        if(AssetDatabase.GUIDToAssetPath(ret) != "")
            Debug.Log("Folder asset created");
        else
            Debug.Log("Couldn't find the GUID for the path");
        
        // Move
        ret = AssetDatabase.MoveAsset(AssetDatabase.GetAssetPath(material), "Assets/NewFolder/MyMaterialNew.mat");
        if(ret == "")
            Debug.Log("Material asset moved to NewFolder/MyMaterialNew.mat");
        else
            Debug.Log(ret);
        
        // Copy
        if(AssetDatabase.CopyAsset(AssetDatabase.GetAssetPath(material), "Assets/MyMaterialNew.mat"))
            Debug.Log("Material asset copied as Assets/MyMaterialNew.mat");
        else
            Debug.Log("Couldn't copy the material");
        // Manually refresh the Database to inform of a change
        AssetDatabase.Refresh();
        Material MaterialCopy = AssetDatabase.LoadAssetAtPath("Assets/MyMaterialNew.mat", typeof(Material)) as Material;
        
        // Move to Trash
        if(AssetDatabase.MoveAssetToTrash(AssetDatabase.GetAssetPath(MaterialCopy)))
            Debug.Log("MaterialCopy asset moved to trash");
        
        // Delete
        if(AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(material)))
            Debug.Log("Material asset deleted");
        if(AssetDatabase.DeleteAsset("Assets/NewFolder"))
            Debug.Log("NewFolder deleted");
        
        // Refresh the AssetDatabase after all the changes
        AssetDatabase.Refresh();
    }
}

平台切换和重新导入

在平台之间切换可能会导致 Unity 重新导入您的资源。这通常发生在资源的导入方式在不同平台之间存在差异时,这种情况很常见。例如,不同的平台有不同的 纹理格式一种文件格式,用于处理 3D 图形硬件(例如显卡或移动设备)在实时渲染期间处理纹理。 了解更多信息
术语表 中查看
,因此纹理在每个平台上的导入方式都不同。

使用 Asset Database V2 时,平台是资源数据库用来存储 Unity 内置导入器的导入结果的哈希的一部分。这意味着在不同平台上导入资源的结果将作为独立的缓存数据片段存储。

此功能的结果是,当您第一次在项目中使用尚未为该平台导入的新资源切换平台时,它们将被重新导入。这意味着您必须等待该过程完成。但是,新的重新导入数据不会覆盖先前平台的旧缓存导入数据。

这意味着,只要您随后切换回已为该平台导入资源的平台,这些资源导入结果已缓存并可以使用,这使得切换速度更快。

资源数据库版本

本手册指的是 版本 2 的资源数据库,它是使用 Unity 2019.3 或更高版本创建的新项目的默认版本。旧版(版本 1)是早期版本的 Unity 中的默认版本,它以不同的方式工作。旧版不能在 Unity 2020+ 中使用。

资源元数据
刷新资源数据库