包含此页的版本:
不含此页的版本:
这AssetDatabaseclass 具有允许您以与 Unity 编辑器相同的方式访问和执行资产作的方法。您可以创建、导入、删除、复制、移动、加载和保存资产,并搜索资产数据库。
这意味着您可以使用 Unity 的编辑器脚本和编辑器窗口自定义创建从简单调整到强大工具和自定义到项目资产工作流程的任何内容。
有关可用方法的完整列表以及每种方法的文档,请参阅AssetDatabaseAPI 参考。
在从代码更改资产时,可以使用批处理来节省时间。如果对多个资产进行更改,资产数据库的默认行为是依次处理每个更改,并在继续下一行代码之前对资产执行完全刷新过程。
以下示例更改三个资产,复制Asset1移动Asset2,并删除Asset3:
AssetDatabase.CopyAsset("Assets/Asset1.txt", "Assets/Text/Asset1.txt");
AssetDatabase.MoveAsset("Assets/Asset2.txt", "Assets/Text/Asset2.txt");
AssetDatabase.DeleteAsset("Assets/Asset3.txt");
在没有批处理的情况下,Unity 会处理每个更改,然后再继续执行下一行代码。这需要不必要的长时间并触发许多回调。
为了节省时间,您可以使用AssetDatabaseAPI 来暂停自动资产导入,在代码中定义一系列资产作,然后恢复自动导入。恢复时,资产数据库将定义的资产作作为批处理,这比逐个处理它们更快。
有关更多详细信息和示例实现,请参阅AssetDatabase.StartAssetEditingAPI 参考。
资产文件可以包含多个序列化对象,每个对象都可以被视为一个资产,以便使用AssetDatabase类。例如,一个.预制件:一种资产类型,允许您存储包含组件和属性的游戏对象。预制件充当模板,你可以从中在场景中创建新的对象实例。更多信息
请参阅术语表资产文件可以包含序列化的游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
请参阅术语表连接了多个组件。这些组件中的每一个也会序列化为资产文件中的对象,因此在使用AssetDatabase方法,则资产文件中的组件对象被视为子资产。
当资产类型包含多个序列化资产对象时,Unity 会将其中一个资产视为主资产。主资产始终是添加到文件中的第一个资产,除非使用SetMainObject方法。
编辑器在项目窗口一个窗口,显示您的内容Assets文件夹(项目选项卡)更多信息
在术语表中查看.在以下示例中,FBX资产文件包含Space Frigate模型在“项目”窗口中展开以显示材质和meshUnity 的主要图形原语。网格体构成了 3D 世界的很大一部分。Unity 支持三角或四边形多边形网格。Nurbs、Nurms、Subdiv 曲面必须转换为多边形。更多信息
请参阅术语表作为子资产:
某些子资产类型不会显示在“项目”窗口中。例如,Space Frigate资产文件实际上包含的不仅仅是项目窗口中显示的两个子资产。当您使用访问资产文件时,您可以查看资产的实际数量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 在导入过程中自动添加到游戏对象的每个组件(Transform、MeshFilter 和 MeshRenderer)都算作一个单独的序列化对象。因此,它们是资产文件的子资产,并且就AssetDatabaseAPI 是关于的,每个都是单独的资产。
资产导入顺序对代码有一些重要影响。脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表始终在所有其他非默认资产之前导入和编译,因为它们可以包括自定义资产后处理器或脚本导入器,这些导入器稍后用于导入非脚本资产。
这[InitializeOnLoad]属性是在项目启动时或脚本更改时运行代码的常用方法。此回调在域重新加载后运行,但在导入非脚本资产之前运行。诸如AssetDatabase.LoadAssetAtPath如果从[InitializeOnLoad].对于首次导入的资产,它们将返回 null,并返回正在重新导入的资产的过时版本。
自定义脚本导入器、资产预处理器和资产后处理器的代码不应依赖于按确定顺序导入的特定资产。导入过程按类型将资产分组到队列中。这些类型按预定义的顺序导入,但相同类型的资产之间的导入顺序不是确定性的,除非您使用ScriptedImporter.GatherDependenciesFromSourceFile.用GatherDependenciesFromSourceFile还会在资产之间创建依赖关系,因此修改资产会触发依赖于它的任何资产的重新导入。
注意:默认资产由内置的 DefaultImporter 在脚本资产之前导入,因此任何脚本定义的OnPostProcessAllAssets不会为默认资产运行。