はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】asmdefのDefine Constraintsを利用して特定のシンボルが定義されているときのみアセンブリを含める

はじめに

今回はasmdefDefine Constraintsについて取り上げたいと思います。

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の設定方法

また記述した右にチャックマークビックリマークが表示されているはずです。
チェックマークはシンボルが定義されていることを表していて、ビックリマークはシンボルが定義されていないのでアセンブリが含まれないことを意味しています。

シンボル定義について

Define Constraintsで参照するシンボルは以下です。

  • Scripting Define Symbols 設定 (Project Settings の中の Player セクションにあります) で定義されたシンボル。
  • Unity で定義されているシンボル。プラットフォーム依存のコンパイル を参照してください。
  • Assembly Definition アセットの Version Defines セクションで定義されたシンボル。

アセンブリの定義 - Unity マニュアル

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