yotiky Tech Blog

とあるエンジニアの備忘録

HoloLens で NuGet の UWP 向けの Library を利用したい

記事にしたいテーマはいくつかあったので、題材を探していたのですがまたしても目に止まったのはかずきさんのブログ。しかも割と最近の記事。
いつも大変お世話になっております。

blog.okazuki.jp

今回のネタは、やりたいことは記事と同じ「 HoloLens で NuGet のライブラリ使いたい」なんですが、 ちょっと前から手元で導入している方法があったので別の方法として紹介しようと思います。
こんな手もあるよ、くらいの感じで参考にしていただけると。

この記事で紹介する方法

インストールコマンドをまとめた ps1 ファイルを Unity プロジェクトフォルダの直下などに用意しておき、Unity のビルド時にソリューションが生成されるフォルダにコピー、初めて生成した時は手動で ps1 をパッケージマネージャコンソールで実行するという方法になります。
* 2回目以降上書きでビルドする場合は不要

目次

NuGet で追加するライブラリ

参照記事と同じ Json.NET を利用しようと思ったのですが、Unity が出力するプロジェクトの参照をよく見るとすでにライブラリが...。

f:id:yotiky:20180426023930p:plain

同じライブラリを追加しても仕方がないので、筆者に敬意を表して ReactiveProperty を追加しましょう。
ただこちらも Json.NET 同様かなり古いバージョンじゃないとインストールに失敗しました。
成功したのは「2.9.0」。一方、最新バージョンは「4.2.2」...。
バージョンの依存関係がかなりシビアになってる様子。

f:id:yotiky:20180426024040p:plain

ReactiveProperty を使ったプログラム

以下のコードを Unity 上で追加します。
Editor 上では利用できない ReactiveProperty を使ったコードが書かれています。
#if ディレクティブによる回避などは記事同様ですね。

#if UNITY_UWP
using Reactive.Bindings;
#endif
using UnityEngine;

public class SampleBehaviourScript : MonoBehaviour
{
#if UNITY_UWP
    public ReactiveProperty<string> Name { get; } = new ReactiveProperty<string>();
#endif
    
    void Start() { }
    
    void Update() { }
}

ps1 ファイルにコマンドをしたためる

予め追加するライブラリのインストールコマンドをしたためた ps1 ファイルを用意します。

Install-Package ReactiveProperty -Version 2.9.0 -Project Assembly-CSharp
Install-Package ReactiveProperty -Version 2.9.0 -Project UsingUwpLibrary

今回は Unity プロジェクト直下に、"install-package.ps1" という名前で作成しました。

f:id:yotiky:20180426024339p:plain

Unity のビルドで下準備

PostProcessBuildAttribute を使って、ソリューションの出力先に先程の ps1 ファイルをコピーするようにします。
このようなコードを、 Editor フォルダの下に入れることで Unity がよしなに実行してくれます。

using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEngine;

public class AddPackageBuildPostprocessor
{
    [PostProcessBuild]
    public static void OnPostProcessBuild(BuildTarget target, string pathToBuildProject)
    {
        if (File.Exists("./install-package.ps1"))
        {
            File.Copy("./install-package.ps1", "./App/install-package.ps1", true);
        }
    }
}

f:id:yotiky:20180426024446p:plain

生成されたソリューション

生まれたばかりはこんな感じ。このままビルドするとエラーになります。

f:id:yotiky:20180426024751p:plain

パッケージマネージャコンソールが開いてない場合は開きます。

f:id:yotiky:20180426024602p:plain

コピーされている install-package.ps1 を実行します。
別にあれこれやってコピーしなくても「..\」一つ書き足すだけでも動くんですががが。

PM> .\install-package.ps1

実行結果はこちらになります。
参照に必要なライブラリが追加されていますのでビルドが通るようになりました。

f:id:yotiky:20180426024821p:plain

Unity から初めてソリューションを生成した場合に1回実行すれば、次回以降上書きでビルドしている分にはライブラリを追加する作業は不要になります。
とは言え、たまにソリューションの調子が悪くなってフォルダ毎ゴミ箱に突っ込む事もあるので、その場合は再度 ps1 を実行してあげれば復元できます。

まとめ

今回は、HoloLens で NuGet の UWP 向けのライブラリを利用する方法を紹介しました。
簡単におさらいすると、 Install-Package のコマンドを用意しておき、Unity ビルド後に手動で実行するという方法でした。

PostProcessBuild と install-package.ps1 は、どのプロジェクトでも共通で使い回せるので、github などに最初から突っ込んで置くと便利です。
必要になったタイミングで install-package.ps1 に想いをしたためてあげると良いでしょう。