Unity は以下の場合にアセットデータベースを最新情報に更新します。
他の AssetDatabase API は Refresh() を呼び出しますが、指定したアセットに対してのみです。例えば CreateAsset() や ImportAsset() などです。
Unity はアセットデータベースの更新中に以下の手順を実行します。
Unity は、アセットデータベースの更新中に前のセクションで説明した手順を実行します。このセクションでは、このプロセスについて詳しく説明します。これらのステップはループ内で発生し、一部のステップでは更新プロセスが再起動する可能性があります (例えば、アセットのインポートによって Unity もインポートする必要のある他のアセットを作成します)。
Unity は、以下の条件でアセットデータベースの更新ループを再起動をします。
Unity はディスク上の変更を検索するとき、プロジェクトの Assets フォルダーと Packages フォルダーをスキャンし、前回のスキャン以降にファイルが追加、変更、削除されていないか確認します。変更をリストにまとめ、次のステップで処理します。
Unity がファイルリストを収集すると、追加または変更されたファイルのファイルハッシュを取得します。次に、それらのファイルの GUID でアセットデータベースを更新し、削除されたことが検出されたファイルの記録を削除します。
アセットデータベースは、静的依存関係と動的依存関係の 2 種類のアセット依存関係を追跡します。アセットの依存関係が変更されると、Unity はそのアセットの再インポートをトリガーします。
静的依存関係は、インポーターが依存する値、設定、プロパティです。静的な依存関係はアセットがインポートされる前に認識され、インポート処理の間、インポーターの動作には影響されません。アセットの静的依存関係が変更されると、Unity はそのアセットを再インポートします。
一般的な静的依存関係の例は以下のとおりです。
Unity は通常、インポート処理の間にアセットの動的依存関係を検出します。これは、これらの依存関係がソースアセットのコンテンツによって定義されているためです。例えば、シェーダーが別のシェーダーを参照したり、プレハブが他のプレハブに依存する場合などがその例です。
インポーターは、ソースアセットのコンテンツに基づいて条件付きでグローバルステートを使用する場合もあります。その場合も動的依存関係になります。この例としては、ターゲットプラットプラットフォーム、プロジェクトの色空間、グラフィックス API、スクリプティングランタイムバージョン、テクスチャの圧縮状態などがあります。
Unity は、アセットのこれらの動的な依存関係を、Asset Import Context に保存します。
変更または追加されたファイルのリストで、Unity はコードに関連するファイルを収集し、それらをスクリプトコンパイルパイプラインに送信します。コンパイラーは、プロジェクトのスクリプトファイルとアセンブリ定義ファイルからアセンブリを生成します。この手順の詳細は、スクリプトコンパイルアセンブリ定義ファイルに関するドキュメントを参照してください。
Unity はスクリプトの変更を検出すると、C# ドメインをリロードします。これは、新しい Scripted Importer が作成された可能性があり、そのロジックが更新キューのアセットのインポート結果に影響を与える可能性があります。この手順によって Refresh() が再起動され、新しい Scripted Importer が有効になります。
Unity がすべてのコード関連アセットをインポートし、ドメインをリロードすると、残りのアセットに移ります。各アセットのインポーターはそのタイプのアセットを処理し、インポートするファイルタイプをファイル名の拡張子に基づいて識別します。例えば、TextureImporter は .jpg、.png、.psd ファイルなどをインポートします。
インポーターには以下の 2 つのタイプがあります。
Unityは、すべてのネイティブインポーターを最初に処理し、次にすべてのスクリプトインポーターを別の段階で処理します。
インポーターがアセットファイルをインポートすると、Unity は AssetImportContext を生成します。AssetImportContext は、アセットの静的依存関係を報告します。
また、インポート処理中に、いくつかのコールバックが発生します。
Asset Importer の呼び出しを前処理します。
OnPreprocessAssetOnPreprocessAnimationOnPreprocessAudioOnPreprocessModelOnPreprocessSpeedTreeOnPreprocessTextureアセットインポーターの呼び出しを後処理します。
OnAssignMaterialModelOnPostprocessAnimationOnPostprocessAssetbundleNameChangedOnPostprocessAudioOnPostprocessCubemapOnPostprocessGameObjectWithAnimatedUserPropertiesOnPostprocessGameObjectWithUserPropertiesOnPostprocessMaterialOnPostprocessMeshHierarchyOnPostprocessModelOnPostprocessSpeedTreeOnPostprocessSpritesOnPostprocessTextureすべてのインポートが完了した後にトリガーされる最後のポストプロセスコールバックは OnPostprocessAllAssets です。
Asset フォルダーの更新処理を再起動すると多くのことが起こります。以下のような例があります。
アセットのインポートに失敗した場合
更新のインポートフェーズ中にアセットが変更された場合。例えば、リスト内のファイルが変更されたために、その変更日が前回の更新時にあった日付と異なる場合などです。これは、エディターにフォーカスがあるときに、バージョン管理システムからファイルの抽出を開始すると発生します。
インポート中にアセットが他のアセットを作成した場合。 例: つまり、Unity はテクスチャ (およびテクスチャが生成するアーティファクト) をインポートする必要があります。
プレ/ポストプロセスのコールバック中、または OnPostProcessAllAssets 内で AssetDatabase.ForceReserializeAssets や AssetImport.SaveAndReimport などを使用してファイルの再インポートを強制する場合。これを行う場合は、無限再インポートループを引き起こさないように注意する必要があります。
スクリプトのコンパイル後にアセンブリのリロードが発生した場合。更新処理中に C# ファイルを生成する場合は、その新しいファイルをコンパイルする必要があるため、Unity は更新して再起動します。
アセットを “Text only” として保存しているのに、アセットをバイナリとしてシリアライズする必要がある場合は、再起動が発生します (例えば、Terrain を含むシーンは、バイナリとしてシリアル化する必要があります。なぜなら、地形データは、テキストファイルの文字の配列として表示すると扱いにくいからです)。
ホットリロード (hot reload) とは、エディターが開いている間に Unity がスクリプトやアセットに変更をインポートして適用する処理のことです。これは、エディターが再生モードまたは再生モード以外の間に発生する場合があります。変更を有効にするために、アプリケーションやエディターを再起動する必要はありません。
スクリプトを変更して保存すると、Unity はプロジェクトのすべてのスクリプトデータをホットリロードします。まず、ロードされたすべてのスクリプトのシリアル化可能な変数の値をすべて保存し、スクリプトをリロードしてから値を再興します。シリアル化できない変数に保存されているデータは、ホットリロードの際にすべて失われます。
これは、プロジェクト内のすべてのエディターウィンドウとすべての MonoBehaviour に影響します。シリアル化の他のケースとは異なり、private のフィールドは、SerializeField 属性を持たなくても、リロード時にデフォルトでシリアル化されます。
注意Unity は、最初にビルトインの DefaultImporter でアセットをインポートし、次にスクリプトアセットをインポートします。そのため、デフォルトのアセットに対して、スクリプトで定義された PostProcessAllAssets は呼び出されません。
これらの手順がすべて完了すると、Refresh() が完了します。アーティファクトデータベースが関連情報によって更新され、必要なインポート結果のファイルがディスクに生成されます。