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).
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.
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;
}
}
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();
}
}
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.