Version: 2020.3
言語: 日本語
アセットのメタデータ
アセットデータベースの更新

アセットデータベース

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

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

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

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

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

アセットデータベースは、各アセットのすべての依存関係を追跡し、すべてのアセットのインポートしたバージョンのキャッシュを保持します。

アセットのインポートの依存関係は、インポートされたデータに影響を与える可能性のあるすべてのデータで構成されます。例えば、アセットのソースファイルは依存関係だけでなく、アセットのインポート設定 (テクスチャの圧縮タイプなど) やプロジェクトのターゲットプラットフォーム (例えば、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();
    }
}

プラットフォームの切り替えと再インポート

プラットフォームを切り替えると、Unity がアセットを再インポートする原因となる場合があります。これは、通常、アセットのインポート方法がプラットフォーム間で異なる場合に発生します。例えば、プラットフォームによってテクスチャのフォーマットが異なります。そのため、テクスチャはプラットフォームごとに異なる方法でインポートされます。

Asset Database V2 を使用する場合、このプラットフォームはハッシュの一部で、アセットデータベースはこれを使って Unity のビルトインインポーターのインポート結果を保存します。つまり、異なるプラットフォームでのアセットのインポート結果は、別々のキャッシュデータとして保存されます。

この機能の結果、初めてプラットフォームを変更する際に、プロジェクトに新しいアセットはあるが、そのプラットフォーム用にはまだインポートされていない場合、そのアセットは再インポートされます。つまり、このプロセスが完了するまで待たなければなりません。ただし、再インポートされた新しいデータは、以前のプラットフォーム用にキャッシュされた古いデータを上書きしません。

つまり、既にアセットをインポートしたプラットフォームに戻る際には、既にインポートしたそのプラットフォーム用のアセットが存在します。これらはキャッシュされ、すぐに使用できる状態になっているため、切り替えがずっと速く行えます。

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

このドキュメントではアセットデータベースの バージョン2 を参照しています。これは、Unity 2019.3 以降で作成される新規プロジェクトでデフォルトになっています。以前のバージョンの Unity では、古いバージョン (バージョン1) がデフォルトで、動作が異なりました。レガシーバージョンは、Unity 2020 以降では使用できません。

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