Version: 2019.1
Detras de Escenas
Archivos de escena basados en texto

AssetDatabase

AssetDatabase es una API que te permite acceder a los assets contenidos en tu proyecto. Entre otras cosas, proporciona métodos para encontrar y cargar assets, y también para crearlos, eliminarlos y modificarlos. El Unity Editor usa el AssetDatabase internamente para realizar un seguimiento de los archivos de asset y mantener la conexión entre los assets y los objetos que los referencien. Puesto que que Unity necesita llevar seguimiento de todos los cambios a la carpeta del proyecto, debes siempre usar la API de AssetDatabase en lugar del sistema de archivos si quieres acceder o modificar datos de assets.

La interfaz de AssetDatabase sólo está disponible en el Editor y no tiene ninguna función en el juego ya construido. Como todas las otras clases para el editor, sólo está disponible para los scripts colocados en la carpeta Editor (si aún no existe, sólo crea una carpeta llamada “Editor” en la carpeta principal de Assets de tu proyecto).

Importar un Asset

Unity normalmente importa assets automáticamente cuando son arrastrados al proyecto, pero también es posible importarlos bajo control de scripts. Para hacer esto puedes usar el método AssetDatabase.ImportAsset como en el siguiente ejemplo.

using UnityEngine;
using UnityEditor;

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

También puedes pasar un parámetro extra del tipo AssetDatabase.ImportAssetOptions para el llamado a AssetDatabase.ImportAsset. En las páginas de referencia de scripting se encuentran descritas las diferentes opciones y sus efectos sobre el comportamiento de la función.

Cargar un Asset

El editor sólo carga assets cuando sea necesario, p.ej. si son agregados a la escena o editados desde el panel Inspector. Sin embargo, puedes cargar y acceder assets desde un script usando AssetDatabase.LoadAssetAtPath, AssetDatabase.LoadMainAssetAtPath, AssetDatabase.LoadAllAssetRepresentationsAtPath y AssetDatabase.LoadAllAssetsAtPath. Ver la documentación de scripting para más detalles.

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;
    }
}

Operaciones de Archivo usando AssetDatabase

Puesto que Unity mantiene los metadatos de los archivos de assets, nunca debes crear, mover o borrar estos assets usando el sistema de archivos. En su lugar, puedes usar AssetDatabase.Contains, AssetDatabase.CreateAsset, AssetDatabase.CreateFolder, AssetDatabase.RenameAsset, AssetDatabase.CopyAsset, AssetDatabase.MoveAsset, AssetDatabase.MoveAssetToTrash y 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();
    }
}

Utilizar AssetDatabase.Refresh

Cuando hayas finalizado la modificación de assets, debes llamar a AssetDatabase.Refresh para ejecutar definitivamente (commit) los cambios a la base de datos y hacerlos visibles en el proyecto.

Detras de Escenas
Archivos de escena basados en texto