【Unity】asmdefのVersion Definesを使って特定のPackageがインストールされていたら自動的に処理を変える

特定の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を作成します。

f:id:halya_11:20210316163954p:plain
UniTaskの参照を設定

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を有効にするには以下のように設定します。

f:id:halya_11:20210316164458p:plain
Version Defines

ちなみにExpressionにバージョンを指定すれば「特定のバージョンのUniTaskがインストールされていたら」といった指定もできます。
本記事の主旨からは逸れるので割愛しますが、必要に応じてマニュアルを参照してください。

docs.unity3d.com

設定完了

ここまでで設定は完了です。

この状態のままUniTaskを削除したらTaskが実行され、
UniTaskを再度インストールすればUniTaskが実行されることが確認できます。

参考

docs.unity3d.com