特殊フォルダーとスクリプトのコンパイル順
ジェネリック関数

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

概要

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 - インポート設定例

インスペクターを使用して、プロジェクト内の他のアセンブリ定義ファイルへの参照を加えます。Unity は参照を使用してアセンブリをコンパイルし、アセンブリ間の依存関係を判断します。

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

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

フォルダー階層内に複数のアセンブリ定義ファイル (拡張子 .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 のアクティブなビルドターゲットと互換性のある事前にコンパイルされたすべてのアセンブリ (プラグイン/ .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"]
}

  • 2017.3 の新機能 NewIn20173
特殊フォルダーとスクリプトのコンパイル順
ジェネリック関数