Version: Unity 6.0 (6000.0)
言語 : 日本語
Unity Accelerator Prometheus metrics reference
Contents of the Asset Database

アセットデータベース

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

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

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

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

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

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

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

アセットのキャッシュ

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

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

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

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

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

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

Unity は Library フォルダーに 2 つのデータベースファイルを保持しています。これらをまとめてアセットデータベースと呼びます。これら 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 の型を渡すことができます。スクリプトリファレンスでさまざまなオプションおよび関数の動作について説明します。

アセットのロード

エディターは、アセットをシーンに追加したり Inspector パネルから編集したりするとき、必要な場合にのみアセットをロードします。ただし、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;
        
        // 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();
    }
}

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

プラットフォームを切り替えると、Unity がアセットを再インポートする場合があります。これは一般的にアセットのインポート方法がプラットフォームによって異なる場合に生じ、よく起こることです。例えば、プラットフォームが違うとテクスチャ形式が異なるため、テクスチャのインポート方法はプラットプラットフォームごとに異なります。

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

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

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

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

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

Unity Accelerator Prometheus metrics reference
Contents of the Asset Database