特殊フォルダーとスクリプトのコンパイル順
.NET profile support

スクリプトのコンパイルとアセンブリ定義ファイル

概要

Unity は、スクリプトがどのようにマネージアセンブリにコンパイルされるかを自動的に定義します。 通常、反復スクリプトの変更に対する Unity エディターのコンパイル時間は、プロジェクトにスクリプトを追加するほど長くなります。

フォルダー内のスクリプトに基づいて独自のマネージアセンブリを定義するには、アセンブリ定義ファイルを使用します。これを行うには、適切に定義された依存関係を持つ複数のアセンブリにプロジェクトのスクリプトを分けます。こうすると、スクリプトで変更を加えたときに必要なアセンブリのみが再構築され、コンパイル時間が削減されます。Unity プロジェクト内では、各マネージアセンブリを単一のライブラリと考えることができます。

図 1 - スクリプトコンパイル
図 1 - スクリプトコンパイル

図 1 上の図は、プロジェクトスクリプトをいくつかのアセンブリに分ける方法を示しています。Main.dll のスクリプトのみを変更すると、他のアセンブリは再コンパイルされません。Main.dll にはスクリプトの数が少ないため、Assembly-CSharp.dll よりも高速でコンパイルされます。同様に、Stuff.dll 内のみでスクリプトの変更があると、Main.dll と Stuff.dll だけが再コンパイルされます。

アセンブリ定義ファイルの使い方

アセンブリ定義ファイルはアセットファイルで、 Assets > Create > Assembly Definition の順に選択して作成できます。拡張子は .asmdef です。

アセンブリ定義ファイルを Unity プロジェクトの任意のフォルダーに加え、フォルダー内のすべてのスクリプトをアセンブリにコンパイルします。アセンブリの名をインスペクターで設定します。

ノート: アセンブリ定義ファイルを置くフォルダーの名とアセンブリ定義ファイルの名は、アセンブリの名前とは無関係です。

Figure 2 - インポート設定例
Figure 2 - インポート設定例

Add references to other assembly definition files in the Project using the Inspector too. To view the Inspector, click your Assembly Definition file and it should appear. To add a reference, click the + icon under the References section and choose your file.

Unity uses the references to compile the assemblies and also defines the dependencies between the assemblies.

To mark the assembly for testing, enable Test Assemblies in the Inspector. This adds references to unit.framework.dll and UnityEngine.TestRunner.dll in the Assembly Definition file.

When you mark an assembly for testing, makes sure that:

  • Predefined assemblies (Assembly-CSharp.dll etc.) do not automatically reference Assembly Definition Files flagged for testing.

  • The assembly is not included in a normal build. To include the assemblies in a player build, use BuildOptions.IncludeTestAssemblies in your building script. Note that this only includes the assemblies in your build and does not execute any tests.

Note: If you use the unsafe keyword in a script inside an assembly, you must enable the Allow ‘unsafe’ Code option in the Inspector. This will pass the /unsafe option to the C# compiler when compiling the assembly.

インスペクターでアセンブリ定義ファイルのプラットフォーム互換性を設定します。これを利用して、特定のプラットフォームを除外したり加えたりすることができます。

フォルダー階層内の複数のアセンブリ定義ファイル

フォルダー階層内に複数のアセンブリ定義ファイル (拡張子 .asmdef) を置くと、各スクリプトが最短パスのアセンブリ定義ファイルに加えられる原因になります。

If you have an Assets/ExampleFolder/MyLibrary.asmdef file and an Assets/ExampleFolder/ExampleFolder2/Utility.asmdef file, then:

  • Assets > ExampleFolder > ExampleFolder2 フォルダー内のすべてのスクリプトは Assets/ExampleFolder/ExampleFolder2/Utility.asmdef が定義したアセンブリにコンパイルされます。

  • Assets > ExampleFolder > ExampleFolder2 フォルダー内に含まれない Assets > ExampleFolder フォルダーのすべてのファイルは、Assets/ExampleFolder/MyLibrary.asmdef が定義したアセンブリにコンパイルされます。

アセンブリ定義ファイルはビルドシステムファイルではありません

ノート: アセンブリ定義ファイルはビルドシステムファイルではありません。アセンブリ定義ファイルは、通常、ビルドシステムに見られる条件付きビルドのルールをサポートしていません。

これは、アセンブリ定義ファイルがプリプロセッサーディレクティブ (define) の設定をサポートしていない理由でもあります。プリプロセッサーディレクティブは常に静的であるからです。

下位互換性と暗示的な依存関係

アセンブリ定義ファイルは、Unity の既存の 事前定義コンパイルシステム と下位互換性があります。つまり、定義済みアセンブリは、常にすべてのアセンブリ定義ファイルのアセンブリに依存します。 これは、すべてのスクリプトが Unity のアクティブなビルドターゲットと互換性のある事前にコンパイルされたすべてのアセンブリ (プラグイン/ .dll) に依存する状態と似ています。

図 3 - アセンブリの依存関係
図 3 - アセンブリの依存関係

図 3 は、定義済みアセンブリ、アセンブリ定義ファイルアセンブリ、プリコンパイルされたアセンブリ間の依存関係を示しています。

Unityは、定義済みコンパイルシステム よりもアセンブリ定義ファイルを優先します。これは、アセンブリ定義ファイルフォルダー内で、事前定義されたコンパイルの特別なフォルダー名を使っても、コンパイルにまったく影響を与えないことを意味します。Unity はこれらを特別な意味を持たない通常のフォルダーとして扱います。

プロジェクト内のすべてのスクリプトに対してアセンブリ定義ファイルを使用するか、または、全く使用しないことを強く推奨します。そうでないと、アセンブリ定義ファイルを使用しないスクリプトは、アセンブリ定義ファイルが再コンパイルされるたびに常に再コンパイルされます。 このように使用すると、アセンブリ定義ファイルを使用する利点が失われてしまいます。

API

UnityEditor.Compilation 名前空間には、静的なCompilationPipeline クラスがあります。これを使用して、アセンブリ定義ファイルや Unity でビルドしたすべてのアセンブリに関する情報を集めることができます。

ファイル形式

アセンブリ定義ファイルは JSON ファイルです。以下のフィールドが含まれます。

フィールド
name 文字列
references (オプション) 文字列配列
includePlatforms (オプション) 文字列配列
excludePlatforms (オプション) 文字列配列

includePlatformsexcludePlatforms のフィールドを同じアセンブリ定義ファイル内で使用しないでください。

プラットフォーム名は CompilationPipeline.GetAssemblyDefinitionPlatforms を使って検索します。

MyLibrary.asmdef

{
    "name": "MyLibrary",
    "references": [ "Utility" ],
    "includePlatforms": ["Android", "iOS"]
}

MyLibrary.asmdef

{
    "name": "MyLibrary2",
    "references": [ "Utility" ],
     "excludePlatforms": ["WebGL"]
}

  • 2018–03–07 限られた 編集レビュー でパブリッシュされたページ

  • 2017.3 の新機能 NewIn20173

  • Custom Script Assemblies updated in 2018.1

特殊フォルダーとスクリプトのコンパイル順
.NET profile support