はじめに
今回はasmdef
のDefine Constraints
について取り上げたいと思います。
概要
Define Constraints
は特定のシンボルが定義されているときのみアセンブリを含めるようにすることができます。
Define Constraints は、Unity がアセンブリをコンパイルまたは参照するために定義しなければならないコンパイラーの #define ディレクティブを指定します。
Unity は、Define Constraints (制約定義) がすべて満たされている場合にのみ、Project アセンブリをコンパイルし参照します。Constraint (制約) は C# の #if プリプロセッサーディレクティブのように動作しますが、スクリプトレベルではなくアセンブリレベルで動作します。制約を満たすためには、 Define Constraints 設定ですべてのシンボルを定義する必要があります。
Assembly Definition のプロパティ - Unity マニュアル
これはビルドした後でもそうですが、エディタ上でも適応されます。シンボルが定義されていない時に他アセンブリから参照があった場合には以下のようなエラーが出力されます。
FileNotFoundException: Could not load file or assembly '〇〇, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies.
設定の仕方
Assembly Definition Asset
のインスペクターのDefine Constraints
に記述をします。
また記述した右にチャックマークかビックリマークが表示されているはずです。
チェックマークはシンボルが定義されていることを表していて、ビックリマークはシンボルが定義されていないのでアセンブリが含まれないことを意味しています。
シンボル定義について
Define Constraints
で参照するシンボルは以下です。
- Scripting Define Symbols 設定 (Project Settings の中の Player セクションにあります) で定義されたシンボル。
- Unity で定義されているシンボル。プラットフォーム依存のコンパイル を参照してください。
- Assembly Definition アセットの Version Defines セクションで定義されたシンボル。
Version Defines
についてはまた後で記事を書こうかなと思っていますが、Assembly Definition Asset
単位で設定できる、特定パッケージがあればシンボル定義をすることができる機能の事です。
Define Constraintsの書き方
#if
ディレクティブのとき程の柔軟性はないようです。
NGの例: UNITY_2019_3_OR_NEWER && UNITY_EDITOR
複数の記述
以下のように複数記述した場合は「かつ」の意味になります。
UNITY_IOS
UNITY_2019_3_OR_NEWER
いわゆるUNITY_IOS && UNITY_2019_OR_NEWER
。
シンボルが未定義
シンボルが未定義のときに適応する場合は!をつけます。
!ENABLE_IL2CPP
または
||
を使う事でどちらかのシンボルが定義されている場合に適応することができます。
UNITY_IOS || UNITY_EDITOR_OSX