Version: 2017.4
За кулисами
Text-Based Scene Files

AssetDatabase

AssetDatabase - это API, который позволяет получить доступ к ассетам, содержащимся в проекте. К тому же он предоставляет методы для поиска и загрузки ассетов, а также позволяет создавать, удалять и изменять их. Редактор Unity использует AssetDatabase для отслеживания файлов ассетов и поддержки связей между ассетами и объектами, ссылающихся на них. Поскольку Unity необходимо отслеживать изменения в папке проекта, то вы должны всегда использовать AssetDatabase API вместо файловой системы для доступа или изменения ассетов.

Интерфейс AssetDatabase доступен только в редакторе и не работает в готовой игре. Как и все другие классы редактора, он доступен только из скриптов расположенных в папке “Editor” (просто создайте папку “Editor” в главной папке “Assets” в своём проекте, если не создавали ранее).

Импорт ассета

Обычно 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.ImportAsset вы можете передать параметр типа AssetDatabase.ImportAssetOptions В справочнике по скриптингу (Scripting Reference) описаны варианты этого параметра и их влияние на результат.

Загрузка ассета

Редактор загружает ассеты, только при необходимости, например, если они добавляются в сцену или редактируются через панель инспектора (Inspector). Тем не менее, вы можете загрузить и получить доступ к ассетам из скрипта используя AssetDatabase.LoadAssetAtPath, AssetDatabase.LoadAllAssetRepresentationsAtPath и AssetDatabase.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.Contains, AssetDatabase.CreateAsset, AssetDatabase.CreateFolder, AssetDatabase.RenameAsset, AssetDatabase.CopyAsset, AssetDatabase.MoveAsset, AssetDatabase.MoveAssetToTrash и AssetDatabase.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();
    }
}

Использование AssetDatabase.Refresh

После завершения изменения ассетов, вы должны вызвать AssetDatabase.Refresh, чтобы сохранить изменения в базу данных и сделать их видимыми в проекте.

За кулисами
Text-Based Scene Files