面白い方へ転がっていくブログ

TouchDesignerとかUnityとか色々使って面白そうな方向へ転がっていきます。

Unity5.6.x + VisualStudio2017でUWPビルドが出来ない問題

今さらUnity5.6?と思われるかもしれませんが、業務なんかで使っていると気軽にバージョンアップ出来なくてUnity5.6を使い続けているなんて環境もあるのではないかと思います。

そんな環境でHoloLens向けにUWPアプリのVisualStudioプロジェクトを出力してビルドした時に、ビルドが通らないという現象に見舞われるので、この記事ではその解決方法を書いてみたいと思います。

なお、これはUnity5.6.x+VisualStudio2017(15.4.1あたり)の組み合わせで発生する問題であり、そのほかのバージョンの組み合わせでは発生しない可能性があります。

問題となるビルドエラー

Unity5.6から出力したUWPプロジェクトをビルドすると、以下のようなエラーが出てビルドが通りません。

NuGet パッケージを復元しています...
NuGet がビルド中にパッケージを復元しないようにするには、Visual Studio の [オプション] ダイアログ ボックスを開き、[パッケージ マネージャー] ノードをクリックして、[ビルド中に足りないパッケージをダウンロードすることを NuGet に許可] チェック ボックスをオフにします。
1>------ すべてのリビルド開始: プロジェクト:Assembly-CSharp-firstpass, 構成: Release x86 ------
1>  Running SerializationWeaver...
1>  System.Collections.Generic.KeyNotFoundException: 指定されたキーはディレクトリ内に存在しませんでした。
1>     場所 System.ThrowHelper.ThrowKeyNotFoundException()
1>     場所 System.Collections.Generic.Dictionary`2.get_Item(TKey key)
1>     場所 UnityEditor.Scripting.Compilers.NuGetPackageResolver.Resolve()
1>     場所 Unity.NuGetAssemblyResolver..ctor(String projectLockFile)
1>     場所 usw.Weaver.ReaderParameters(String assemblyPath, ConversionOptions options)
1>     場所 usw.Weaver.Weave()
1>     場所 usw.Program.RunProgram(ConversionOptions options)
1>     場所 usw.Program.Main(String[] args)
1>(省略)\UnityEngine.Networking.dll"" はコード 1 で終了しました。
2>------ すべてのリビルド開始: プロジェクト:Assembly-CSharp, 構成: Release x86 ------
2>CSC : error CS0006: メタデータ ファイル 'D:\HogeHoge\UWP\GeneratedProjects\UWP\Assembly-CSharp-firstpass\bin\x86\Release\Assembly-CSharp-firstpass.dll' が見つかりませんでした。
3>------ すべてのリビルド開始: プロジェクト:AR_intel_map, 構成: Release x86 ------
3>CSC : error CS0006: メタデータ ファイル 'D:\HogeHoge\UWP\GeneratedProjects\UWP\Assembly-CSharp-firstpass\bin\x86\Release\Assembly-CSharp-firstpass.dll' が見つかりませんでした。
3>CSC : error CS0006: メタデータ ファイル 'D:\HogeHoge\UWP\GeneratedProjects\UWP\Assembly-CSharp\bin\x86\Release\Assembly-CSharp.dll' が見つかりませんでした。
========== すべてリビルド: 0 正常終了、3 失敗、0 スキップ ==========

解決方法

解決方法をザックリ言うと、出力したUWPプロジェクトの中にある「project.lock.json」に記述されているユニバーサル アプリケーション プラットフォーム(以下、UAP)の対象バージョンをちょちょいと書き換える事で解決できます。詳細は後述します。

書き換える「project.lock.json」の場所

書き換える「project.lock.json」は3つあります。

  1. (UWP出力フォルダ)\GeneratedProjects\UWP\Assembly-CSharp\project.lock.json
  2. (UWP出力フォルダ)\GeneratedProjects\UWP\Assembly-CSharp-firstpass\project.lock.json
  3. (UWP出力フォルダ)(アプリケーション名)\project.lock.json

これら3つのproject.lock.jsonを書き換えます。

書き換える内容

上記の3つのファイルを、以下の内容で全て置換します。

  • 置換前:UAP,Version=v10.0.10240
  • 置換後:UAP,Version=v10.0

おそらく古いバージョンのUAPを参照してしまっているために、ビルドがうまく通らなくなっていると思われます。 これをバージョンの下の方を削ってv10.0の中のLatestVersionを参照するように変更しています。

注意点

この解決方法にはいくつか注意点があります。

注意点1: 一度ビルドを行わないと「GeneratedProjects」フォルダ以下のproject.lock.jsonが生成されない

見出し通りなのですが、UWPプロジェクトをUnityから出力した直後は、GeneratedProjectsフォルダ以下のproject.lock.jsonは生成されていません。一度ビルドをして生成してください。 一度生成してしまえば、そのあと再度UnityからUWPプロジェクトを出力しても問題ありません。(後述するリビルドさえしなければ)

注意点2:リビルドを行うと再びproject.lock.jsonの編集を行わないといけない

 これも見出し通りなのですが、リビルドを行うとproject.lock.jsonが再生成されて、また同じ問題が発生します。そのため、リビルドを行った際は再び同じように置換していく必要があります。

ただし、ビルドでは再生成されませんので、通常はUWPプロジェクトを出力した最初だけやって、後はリビルドではなくビルドをすればわざわざ再編集する必要はありません。 


このご時世、Unity5.6を使っている人は少ないかもしれませんが、何かお役に立てれば・・・。また、これ地味に面倒なのでもっと良い解決策がありましたら、誰か教えて下さい!