特定のPackageがインストールされていたら処理を変えるAssembly Definitionを作る方法です。
Unity2020.2
はじめに
例えばいま、UniTaskがインストールされていたらUniTaskを、されていなければ普通のTaskを使うような処理を書きたいとします。
using System.Threading.Tasks; using UnityEngine; using UniTask = Cysharp.Threading.Tasks.UniTask; public class Example : MonoBehaviour { private async void Start() { await FooAsync(); } // UniTaskが入っていなかったらこっちを使う private Task FooAsync() { return Task.CompletedTask; } // UniTaskが入っていたらこっちを使う private UniTask FooAsync() { return UniTask.CompletedTask; } }
まず思いつくのはDefine Symbolを定義してPlayer SettingsのScripting Define Symbolsにそれを追加する方法ですが、
この方法ではUniTaskがインストールされているかどうかを人間が判断して設定する必要があります。
そこでこの記事では特定のPackageがインストールされていたら自動的に処理を変える方法についてまとめます。
対象のパッケージをインストールしておく
まずは対象とするパッケージを一度インストールしておく必要があります。
Package Managerからインストールします。
上述の例ではUniTaskをインストールしておきます。
Assembly Definition Fileを作る
次にAssembly Definition Fileを作成し、前節のパッケージの参照を設定しておきます。
今回の例ではUniTaskが必要なので、以下のようにUniTaskの参照を設定したAssembly Definition Fileを作成します。
Define Symbolを定義する
次にDefine Symbolを定義して処理を分岐させます。
上述の例をDefine Symbolを使った形に書き換えたものが以下です。
using System.Threading.Tasks; using UnityEngine; #if USE_UNITASK using UniTask = Cysharp.Threading.Tasks.UniTask; #endif public class Example : MonoBehaviour { private async void Start() { await FooAsync(); } #if !USE_UNITASK private Task FooAsync() { return Task.CompletedTask; } #else private UniTask FooAsync() { return UniTask.CompletedTask; } #endif }
USE_UNITASKという名前のDefine Symbolで処理を分岐しています。
Version Definesを設定
最後にAssembly Definition Fileのインスペクタの下部からVersion Definesを設定します。
これにより、指定したパッケージが存在したらDefine Symbolを有効にすることができます。
例えばUniTaskがインストールされていたらUSE_UNITASKを有効にするには以下のように設定します。
ちなみにExpressionにバージョンを指定すれば「特定のバージョンのUniTaskがインストールされていたら」といった指定もできます。
本記事の主旨からは逸れるので割愛しますが、必要に応じてマニュアルを参照してください。
設定完了
ここまでで設定は完了です。
この状態のままUniTaskを削除したらTaskが実行され、
UniTaskを再度インストールすればUniTaskが実行されることが確認できます。