Unity は、スクリプトがどのようにマネージアセンブリにコンパイルされるかを自動的に定義します。 通常、スクリプトの変更に対する Unity エディターのコンパイル時間は、プロジェクトに加えるスクリプト量が増えるほど長くなります。
フォルダー内のスクリプトに基づいて独自のマネージアセンブリを定義するには、アセンブリ定義ファイルを使用します。これを行うには、適切に定義された依存関係を持つ複数のアセンブリにプロジェクトのスクリプトを分けます。こうすると、スクリプトで変更を加えたときに必要なアセンブリのみが再構築され、コンパイル時間が削減されます。Unity プロジェクト内では、各マネージアセンブリを単一のライブラリと考えることができます。
図 1 上の図は、プロジェクトスクリプトをいくつかのアセンブリに分ける方法を示しています。Main.dll のスクリプトのみを変更すると、他のアセンブリは再コンパイルされません。Main.dll にはスクリプトの数が少ないため、Assembly-CSharp.dll よりも高速でコンパイルされます。同様に、Stuff.dll 内のみでスクリプトの変更があると、Main.dll と Stuff.dll だけが再コンパイルされます。
アセンブリ定義ファイルはアセットファイルで、 Assets > Create > Assembly Definition の順に選択して作成できます。拡張子は .asmdef です。
アセンブリ定義ファイルを Unity プロジェクトの任意のフォルダーに加え、フォルダー内のすべてのスクリプトをアセンブリにコンパイルします。アセンブリの名をインスペクターで設定します。
ノート アセンブリ定義ファイルを置くフォルダーの名とアセンブリ定義ファイルの名は、アセンブリの名前とは無関係です。
インスペクターを使用して、プロジェクト内の他のアセンブリ定義ファイルへの参照を加えます。インスペクターを表示するには、Assembly Definition ファイルをクリックします。参照を追加するには、Reference セクションの + アイコンをクリックし、ファイルを選択します。
Unity は参照を使用してアセンブリをコンパイルし、アセンブリ間の依存関係を決定します。
テスト用にアセンブリをマークするには、インスペクターの Test Assemblies にチェックを入れます。これにより、アセンブリ定義ファイルに unit.framework.dll と UnityEngine.TestRunner.dll への参照が加えられます。
テスト用にアセンブリをマークするときは、以下を確認します。
事前定義されたアセンブリ (Assembly-CSharp.dll など) は、テスト用にフラグが立てられたアセンブリ定義ファイルを自動的には参照しません。
アセンブリは通常のビルドに含まれません。アセンブリをプレイヤービルドに含めるには、スクリプトをビルドするときに BuildOptions.IncludeTestAssemblies を使用します。これはビルド内のアセンブリを含めることのみを行い、テストを実行しないことに注意してください。
注意 アセンブリ内のスクリプトで unsafe キーワードを使用する場合は、インスペクターで Allow ‘unsafe’ Code にチェックを入れる必要があります。これにより、アセンブリをコンパイルするときに、C# コンパイラーに /unsafe オプションが渡されます。
インスペクターでアセンブリ定義ファイルのプラットフォーム互換性を設定します。これを利用して、特定のプラットフォームを除外したり加えたりすることができます。
フォルダー階層内に複数のアセンブリ定義ファイル (拡張子 .asmdef) を置くと、各スクリプトが最短パスのアセンブリ定義ファイルに加えられる原因になります。
例
Assets/ExampleFolder/MyLibrary.asmdef ファイルと Assets/ExampleFolder/ExampleFolder2/Utility.asmdef ファイルがある場合は、以下のようになります。
Assets > ExampleFolder > ExampleFolder2 フォルダー内のすべてのスクリプトは Assets/ExampleFolder/ExampleFolder2/Utility.asmdef が定義したアセンブリにコンパイルされます。
Assets > ExampleFolder > ExampleFolder2 フォルダー内に含まれない Assets > ExampleFolder フォルダーのすべてのファイルは、Assets/ExampleFolder/MyLibrary.asmdef が定義したアセンブリにコンパイルされます。
ノート アセンブリ定義ファイルはビルドシステムファイルではありません。アセンブリ定義ファイルは、通常、ビルドシステムに見られる条件付きビルドのルールをサポートしていません。
これは、アセンブリ定義ファイルがプリプロセッサーディレクティブ (define) の設定をサポートしていない理由でもあります。プリプロセッサーディレクティブは常に静的であるからです。
アセンブリ定義ファイルは、Unity の既存の 事前定義コンパイルシステム と下位互換性があります。つまり、定義済みアセンブリは、常にすべてのアセンブリ定義ファイルのアセンブリに依存します。 これは、すべてのスクリプトが Unity のアクティブなビルドターゲットと互換性のある事前にコンパイルされたすべてのアセンブリ (plugins/.dll) に依存する状態と似ています。
図 3 は、定義済みアセンブリ、アセンブリ定義ファイルアセンブリ、プリコンパイルされたアセンブリ間の依存関係を示しています。
Unityは、定義済みコンパイルシステム よりもアセンブリ定義ファイルを優先します。これは、アセンブリ定義ファイルフォルダー内で、事前定義されたコンパイルの特別なフォルダー名を使っても、コンパイルにまったく影響を与えないことを意味します。Unity はこれらを特別な意味を持たない通常のフォルダーとして扱います。
プロジェクト内のすべてのスクリプトに対してアセンブリ定義ファイルを使用するか、または、全く使用しないことを強く推奨します。そうでないと、アセンブリ定義ファイルを使用しないスクリプトは、アセンブリ定義ファイルが再コンパイルされるたびに常に再コンパイルされます。 このように使用すると、アセンブリ定義ファイルを使用する利点が失われてしまいます。
UnityEditor.Compilation 名前空間には、静的なCompilationPipeline クラスがあります。これを使用して、アセンブリ定義ファイルや Unity でビルドしたすべてのアセンブリに関する情報を集めることができます。
アセンブリ定義ファイルは JSON ファイルです。以下のフィールドが含まれます。
フィールド | 型 |
---|---|
name | 文字列 |
references (オプション) | 文字列配列 |
includePlatforms (オプション) | 文字列配列 |
excludePlatforms (オプション) | 文字列配列 |
includePlatforms と excludePlatforms のフィールドを同じアセンブリ定義ファイル内で使用しないでください。
プラットフォーム名は CompilationPipeline.GetAssemblyDefinitionPlatforms
を使って検索します。
MyLibrary.asmdef
{
"name": "MyLibrary",
"references": [ "Utility" ],
"includePlatforms": ["Android", "iOS"]
}
MyLibrary.asmdef
{
"name": "MyLibrary2",
"references": [ "Utility" ],
"excludePlatforms": ["WebGL"]
}