内部処理
ランタイム時にリソースをロード

AssetDatabase

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Sumbission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

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

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 をコールしてデータベースに変更をコミットしてプロジェクトで見えるようにします。

内部処理
ランタイム時にリソースをロード