Version: 2021.1
Asset Metadata
アセットデータベースの更新

アセットデータベース

ほとんどのタイプのアセットでは、Unity はデータをアセットのソースファイルからゲームやリアルタイムアプリケーションで使用できる形式に変換する必要があります。これらの変換されたファイルとそれらに関連するデータは アセットデータベース に保存されます。

ほとんどのファイル形式はストレージスペースを節約するように最適化されているため、変換処理が必要です。ところが、ゲームやリアルタイムのアプリケーションでは、アセットデータは CPU、グラフィックス、オーディオハードウェアなどのハードウェアですぐに使用できる形式である必要があります。例えば、Unityが .png 画像ファイルをテクスチャとしてインポートする場合 、元の .png 形式のデータはランタイムに使用されません。代わりに、テクスチャをインポートすると、Unity はプロジェクトの Library フォルダーに保存されている異なる形式で新しい画像ファイルを作成します。Unity エンジンの Texture クラスはこのインポートされたバージョンを使用し、Unity はそれを GPU にアップロードしてリアルタイムで表示します。

その後、すでにインポートしたアセットのソースファイルを変更する場合 (または、その依存関係を変更する場合)、Unity はファイルを再インポートし、先にインポートしたバージョンのデータを更新します。この処理の詳細については、アセットデータベースの更新 を参照してください。

アセットデータベースは AssetDatabase API も提供します。これを使用してアセットにアクセスし、インポート処理の制御やカスタマイズを行えます。

ノート: このドキュメントはアセットデータベースの version 2 を参照しています。詳細は、次の アセットデータベースのバージョン を参照してください。

アセットインポートの依存関係

The Asset Database keeps track of all the dependencies for each asset, and keeps a cache of the imported versions of all the Assets.

アセットのインポートの依存関係は、インポートされたデータに影響を与える可能性のあるすべてのデータで構成されます。例えば、アセットのソースファイルは依存関係だけでなく、アセットのインポート設定 (テクスチャの圧縮タイプなど) やプロジェクトのターゲットプラットフォーム (例えば、PS4 ハードウェアには Android とは異なる形式のデータが必要です) などが含まれます。これらの依存関係を変更すると、インポートされたアセットのキャッシュされたバージョンは無効になり、変更を反映するためにはそのアセットを再インポートする必要があります。

アセットのキャッシュ

アセットのキャッシュは Unity がインポートしたバージョンのアセットを保存する場所です。Unity はソースアセットファイルとその依存関係からインポートされたこれらのバージョンを常に再作成できるため、これらは事前計算されたデータのキャッシュとして扱われ、Unity を使用するときに時間を節約します。このため、アセットキャッシュ内のファイルをバージョン管理システムから除外する必要があります。

Unity はデフォルトでローカルキャッシュを使用しています。つまり、インポートされたバージョンのアセットがローカルマシンのプロジェクトフォルダーの Library フォルダーにキャッシュされていることを意味します。バージョン管理からこのフォルダーを除外するには、ignore file を使用します。

ただし、チームの一員として作業し、バージョン管理システムを使用する場合は、LAN 全体でアセットキャッシュを共有する Unity Accelerator も使用すると便利です。

キャッシュされたアセットはバージョン管理システムに保存するのに適していないため、チームがプロジェクトで共同でローカルキャッシュを使用する場合、アセットや依存関係が変更されると、すべてのチームメンバーの Unity のコピーがインポートプロセスを実行します。これは効率的ではありません。

Unity はこの問題に対し、Unity Accelerator と呼ばれるソリューションを提供します。Accelerator の機能の 1 つはソフトウェアエージェントで、同じローカルネットワークで同じプロジェクトで一緒に作業しているすべてのユーザーに対し、キャッシュされたバージョンのアセットを保存、提供します。つまり、1 人のチームメンバーがアセットをインポートするだけで済みます。インポートされたバージョンのアセットは Accelerator に保存されるため、他のチームメンバーはローカルでインポート処理を行う代わりに、キャッシュされたバージョンをダウンロードできます。

ソースアセットとアーティファクト

Unity は 2 つのデータベースファイルを Library フォルダーに保存します。それらをまとめてアセットデータベースと呼びます。これら 2 つのデータベースは、ソースアセットファイルに関する情報と、インポート結果に関する情報であるアーティファクトを追跡します。

ソースのアセットデータベース

ソースアセットデータベースにはソースアセットファイルに関するメタ情報が含まれています。これに基づいて、Unity はファイルが変更されているかどうか、その結果ファイルを再インポートするかどうかを判断します。これには、最終更新日、ファイルコンテンツのハッシュ、GUID、その他のメタ情報などの情報が含まれます。

アーティファクトデータベース

アーティファクトはインポート処理の結果です。アーティファクトデータベースには、各ソースアセットのインポート結果に関する情報が含まれています。各アーティファクトには、インポートの依存関係情報、アーティファクトのメタ情報、アーティファクトファイルのリストが含まれます。

ノート: データベースファイルはプロジェクトの Library フォルダーにあるため、バージョン管理システムから除外する必要があります。データベースファイルは以下の場所にあります。

  • ソースアセットデータベース: Library\SourceAssetDB
  • アーティファクトデータベース: Library\ArtifactDB

アセットのインポート

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 はアセットファイルのメタデータを維持するため、ファイルシステムを使用してアセットの作成、移動、削除をすべきではありません。ファイルシステムの代わりに以下を使用してください。AssetDatabase.ContainsAssetDatabase.CreateAssetAssetDatabase.CreateFolderAssetDatabase.RenameAssetAssetDatabase.CopyAssetAssetDatabase.MoveAssetAssetDatabase.MoveAssetToTrashAssetDatabase.DeleteAsset

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

Platform Switching and reimporting

Switching between platforms might cause Unity to reimport your assets. This usually happens when the way the asset is imported differs between platforms, which is often the case. For example, different platforms have different texture formats, so textures are imported differently for each platform.

When using Asset Database V2, the platform is part of the hash that the Asset Database uses to store the import results for Unity’s built-in importers. This means that the results for importing your assets on different platforms are stored as separate pieces of cached data.

The result of this feature is that the first time you switch platform with new assets in your project that haven’t already been imported for that platform, they are reimported. This means that you have to wait for that process to complete. However the new reimported data does not overwrite the old data cached import for the previous platform.

This means whenever you subsequently switch back to a platform where you have already imported assets for that platform, those asset import results are already cached and ready to use, making the switch much faster.

アセットデータベースのバージョン

This documentation refers to the version 2 of the Asset Database, which is the default in new Projects created with Unity 2019.3 or newer. The legacy version (version 1) was the default in earlier versions of Unity, which behaves in a different way. The legacy version cannot be used in Unity 2020+.

Asset Metadata
アセットデータベースの更新