AssetDatabaseはプロジェクトのアセットにアクセスできる API です。アセットを見つけてロードするメソッドがあり,さらにアセットを作成,削除,修正できるメソッド等々があります。 Unity エディター は AssetDatabase を使用して内部的にアセットファイルをトラッキングして,アセットおよびそれを参照するオブジェクトのリンクを保持します。Unityはプロジェクトフォルダへの全ての変更をトラッキングする必要があるため, アセットデータをアクセスまたは修正した場合はファイルシステムではなくAssetDatable 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 の型を渡すことが出来ます。スクリプティング リファレンスのドキュメントで様々なオプションおよび関数の動作について説明します。
エディターはアセットを必要な場合にのみロードします。例えばシーンに追加したり,またはインスペクタ パネルから編集した場合など,です。しかしアセットをスクリプトからロードおよびアクセスするには AssetDatabase.LoadAssetAtPath, AssetDatabase.LoadMainAssetAtPath , 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;
}
}
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 をコールしてデータベースに変更をコミットしてプロジェクトで見えるようにします。