Version: 2019.1
アセットの内部処理
テキストシーン形式

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 の型を渡すことができます。スクリプトリファレンスでさまざまなオプションおよび関数の動作について説明します。

アセットのロード

エディターはアセットを必要な場合にのみロードします。例えばシーンに追加したり、またはインスペクターパネルから編集した場合など、です。しかしアセットをスクリプトからロードおよびアクセスするには AssetDatabase.LoadAssetAtPathAssetDatabase.LoadMainAssetAtPathAssetDatabase.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 はアセットファイルのメタデータを保持するため、絶対に Unity 以外のファイルシステムを使用してアセットの作成、移動、削除をすべきではありません。Unity上で AssetDatabase.ContainsAssetDatabase.CreateAssetAssetDatabase.CreateFolderAssetDatabase.RenameAssetAssetDatabase.CopyAssetAssetDatabase.MoveAssetAssetDatabase.MoveAssetToTrashAssetDatabase.DeleteAsset の API を使用してファイルを操作します。

public class AssetDatabaseIOExample {
    [MenuItem ("AssetDatabase/FileOperationsExample")]
    static void Example ()
    {
        string ret;
        
        // 作成
        Material material = new Material (Shader.Find("Specular"));
        AssetDatabase.CreateAsset(material, "Assets/MyMaterial.mat");
        if(AssetDatabase.Contains(material))
            Debug.Log("Material asset created");
        
        // 名前変更
        ret = AssetDatabase.RenameAsset("Assets/MyMaterial.mat", "MyMaterialNew");
        if(ret == "")
            Debug.Log("Material asset renamed to MyMaterialNew");
        else
            Debug.Log(ret);
        
        // フォルダーの作成
        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");
        
        // 移動
        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);
        
        // コピー
        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");
        //変更をしらせるために手動でデータベースをリフレッシュする 
        AssetDatabase.Refresh();
        Material MaterialCopy = AssetDatabase.LoadAssetAtPath("Assets/MyMaterialNew.mat", typeof(Material)) as Material;
        
        // トラッシュに移動
        if(AssetDatabase.MoveAssetToTrash(AssetDatabase.GetAssetPath(MaterialCopy)))
            Debug.Log("MaterialCopy asset moved to trash");
        
        // 削除
        if(AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(material)))
            Debug.Log("Material asset deleted");
        if(AssetDatabase.DeleteAsset("Assets/NewFolder"))
            Debug.Log("NewFolder deleted");
        
        // すべての変更後に AssetDatabase をリフレッシュ
        AssetDatabase.Refresh();
    }
}

AssetDatabase.Refresh の使用

アセットの修正が終わったら、AssetDatabase.Refresh をコールしてデータベースに変更をコミットしてプロジェクトで見えるようにします。

アセットの内部処理
テキストシーン形式