はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

Unityで作成したアプリをMicrosoftストアで配布するには

事前準備

Unityでビルドされるexe名は、あらかじめMicrosoft Storeで名前の予約をしておきます。

例)HoloLabStoreCheck2D 

Unityアプリ側での設定

Build Settingsを開いて、
Platformで「PC, Mac & Linux Standalone」を選択して、Target Platformに「Windows」を指定、Architectureは「x86_64」を選択します。
これで、配布ターゲットは、Windows 10 x64のみとなります。
必要なのはExeや実行に必要なDLLそしてデータですので、Create Visual Studio Solutionは不要です。

Player SettingでProduct Nameにストアで予約した名前にします。
「↓」タブの中のIconなど必要な設定をします。

BuildボタンとクリックしてExeの生成先をUnityのプロジェクトフォルダ配下(例:Buildフォルダ)に指定します。
以降の説明では、Unityプロジェクトフォルダ直下にBuildフォルダがあることを前提とします、

作成先のフォルダの内容を確認します。
例)
HoloLabStoreCheck2D.exe
UnityCrashHandler64.exe
UnityPlayer.dll
WinPoxEventRuntime.dll
HoloLabStoreCheck2D_Dataフォルダ
MonoBleedingEdgeフォルダ

Visual StudioWindowsアプリケーションパッケージプロジェクトを作成

Visusl Studioを立ち上げて、Windowsアプリケーションパッケージプロジェクトを新規作成します。
プロジェクト名は、UnityのExe名+AppPackageを推奨します(例:HoloLabStoreCheck2DAppPackage)
場所は、Unityプロジェクトフォルダを指定します(以降の説明は、この位置を指定している前提となります)。
「ソリューションとプロジェクトを同じディレクトリに配置する」チェックは外したままです。

ターゲットプラットフォームを指定します。UWPアプリケーションがサポートするとありますが気にしないで大丈夫です。
ターゲットバージョンは、できれば最新のバージョンを指定するのがいいでしょう。
最小バージョンはビルド14393(バージョン1607)以降を指定する必要があります。2020/04/30現在のWindows 10サポートは1803以降なので、1809以降を指定するのも1案です。
※LTSC/LTSBを考慮するならば、ビルド14393(バージョン1607)のLTSCの延長サポート終了日が2026/10/13なのでそれを最小バージョンとするという戦略もあります。

Unityで作成したexeを直接指定できないので中間プロジェクトを作成

次に、.NET Frameworkのコンソールアプリプロジェクトを追加します。
このあたりから正攻法から外れた邪法に突入しますので、本当はWindowsアプリケーションパッケージプロジェクトのテンプレートあたりでUnityアプリの配布もサポートしてくれるといいんじゃないかと思います。
プロジェクト名はUnityのExe名と必ず同じ(例:HoloLabStoreCheck2D)にします。

プロジェクトが追加されたらばVisual Studioの[ビルド]-[構成マネージャー]で

  • アクティブソリューション構成:Release
  • アクティブソリューションプラットフォーム:x64

を選択します。
そうするとコンソールアプリのプラットフォームが「Any CPU」のままなので、x64を追加して選択しておきます。

パッケージ対象のプロジェクトとして参照

 次にソリューションエキスポローラーで、Windowsアプリケーションパッケージプロジェクトの「アプリケーション」を右クリックして[参照の追加]で、追加したコンソールアプリケーションプロジェクトを参照します。

上記が完了したら、このあたりで、[ファイル]-[すべて保存]で、一度保存しておきましょう。

中間プロジェクトにUnityアプリの実行ファイルをコピー

コンソールアプリケーションプロジェクト名を右クリックして、[エクスプローラーでフォルダを開く]をします。
エキスプローラ―での表示例:

f:id:hatsune_a:20200430144100p:plain

このフォルダにUnityでビルドした中身を丸ごとコピーします。

f:id:hatsune_a:20200430144156p:plain

中間プロジェクトビルド時にUnityアプリの実行ファイルが使われるように調整

ソリューションエキスプローラ―でコンソールアプリケーションプロジェクト名を指定して[すべてのファイルを表示]します。
さらに
HoloLabStoreCheck2D_Dataフォルダ
MonoBleedingEdgeフォルダ
HoloLabStoreCheck2D.exe
UnityCrashHandler64.exe
UnityPlayer.dll
WinPixEventRuntime.dll
を選択して右クリックメニューで[プロジェクトに含める]をクリックします。

f:id:hatsune_a:20200430143941p:plain

これでUnityアプリが必要としているファイルやフォルダ構造がプロジェクトに取り込まれました。

更にプロジェクトに含めたexeやdll、フォルダ内のファイル全てのプロパティを次のように指定します。

  • ビルドアクション:なし
  • 出力ディレクトリにコピー:常にコピーする 

コンソールアプリをビルドします。

bin\x64\ReleaseフォルダにUnityのビルド先と同じファイル+若干のコンソール用ファイルが出力されているのが確認できると思います。

もし、bin\x64\Releaseフォルダではなくbin\Releaseフォルダに出力されていたらプラットフォームがAny CPUのままなので再確認をしてください。

この状態でexeファイルをダブルクリックして実行してもコンソールアプリが実行されます。
つまり、Unityで作成した実行ファイルとコンソールアプリケーションプロジェクトでビルドされるExe名が同じなので出力フォルダでは上書きされてしまうのです。

これを次に解決します。

中間プロジェクトビルド時で作成されたexeファイルをUnityアプリのexeファイルに変更

そこで、ソリューションエキスプローラーからコンソールアプリケーションプロジェクトのプロパティを開いて、[ビルドイベント]-「ビルド後イベントのコマンドライン」に以下をいれて、上書きされた本来のExeを更に本来のものに上書きし直します。

xcopy /Y "$(ProjectDir)$(TargetFileName)" "$(TargetDir)"
del /Q "$(TargetDir)$(TargetName).pdb"

再度、bin\x64\Releaseフォルダ上のexeを起動してみましょう。
作成したUnityアプリが起動するはずです。
無事に起動出来たらば、Windowsアプリケーションパッケージプロジェクトに情報を伝えるためのダミープロジェクトの構成がまずは完了しました。

Microsoft Storeに登録

ここから先は、WPFアプリなどをAppPackage化してMicrosoft Storeに登録するのと同じ流れになります。
身近に、Windows Phoneアプリ、Windows Storeアプリ、UWPアプリのストア配布経験者がいらっしゃるようであれば、ぜひ、その方に以降の手順を一読いただいて以降の説明をショートカットするチートルートを進んでいただければと思います。

Package.appxmanifestの編集(AppPackage化特有事項)

WindowsアプリケーションパッケージプロジェクトにあるPackage.appxmanifestをテキストエディタVisual Studio Codeで開くと下記の部分があります。
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0" />
</Dependencies>
こちらからWindows.Universalの行を削除して保存しましょう。
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0" />
</Dependencies>

Package.appxmanifestの内容設定(UWPアプリと同等項目)

次にソリューションエキスプローラーでPackage.appxmanifestをダブルクリックして内容を編集します。
表示名は、元々とのExe名にAppPackageが付いた形になっているので適切な名前にします。

例:HoloLabStoreCheck2DAppPackage→HoloLabStoreCheck2D for Desktop

説明もきちんと記載しましょう。
パッケージ化のところにもパッケージ表示名があるのでそちらも同様(例:HoloLabStoreCheck2DAppPackage→HoloLabStoreCheck2D)に編集します。
[ビジュアル資産]のところにアプリのアイコン画像など必要な解像度のアイコンを作成します。
大きめのアイコンファイルを作成して、[生成]ボタンで一気に必要な解像度の画像を自動生成するのも良いでしょう。
アイコンは背景を透過pngにしておき、タイルの背景やスプラッシュスクリーンの背景に色を指定してください。
もしくは、アイコンのイメージ部分を白で作成し、背景指定色をtransparentを指定してシステムカラーを使うようにするのも、それっぽい感じの仕上げになります。

試しにローカルインストールを確認

コンソールアプリケーションプロジェクトを右クリックして[リビルド]します。
Windowsアプリケーションパッケージプロジェクトを右クリックして[配置]を実行します。
うまく配置がいけば、Windowsのスタートの中にアプリが出現します(例:HoloLabStoreCheck2D)。
配置したアプリを実行してUnityアプリが起動すれば、ストア登録前の確認は終了です。
忘れずにアンインストールして置きましょう。

Microsoft Storeに登録

Windowsアプリケーションパッケージプロジェクトを右クリック[公開]-[アプリパッケージの作成]をクリックします。
配布方法は、アプリ名は予約済ですが[新しいアプリ名でMicrosoft Storeに]を選択します。
ストアに登録するアカウントを追加して、[既存のアプリケーション名]リストから、事前に予約した名前を選択します。
バージョンは[自動的に増加]チェックは外して、アーキテクチャはx64のみチェックします。ソリューション構成も「Release (x64)」になっていることを確認して、[作成]をクリックします。
成功すれば次のような出力となります。

1>パッケージが正常に作成されました。
========== 公開: 1 正常終了、0 失敗、0 スキップ ==========
パッケージが Release (x64) 向けに正常にビルドされました。
========== パッケージ: 1 正常終了、0 失敗 ===========
アプリケーション バンドルが Release (x64) 向けに正常にビルドされました。
========== アプリケーション バンドル: 1 正常終了、 0 失敗 ===========  

出力先フォルダはプロジェクトフォルダ内のAppPackagesフォルダになります。この中にあるmsixuploadフォルダをストアに登録します。

例)HoloLabStoreCheck2DAppPackage_1.0.0.0_x64_bundle.msixupload  

ストア登録時の注意表示について(AppPackage化特有事項) 

Windowsアプリケーションパッケージプロジェクトは自動的にrunFullTrustがついているので下記の注意書き(次の制限された機能は、アプリで使用する前に承認が必要です)が表示されますが、気にしないで大丈夫です。

The following restricted capabilities require approval before you can use them in your app: runFullTrust. 

f:id:hatsune_a:20200430144332p:plain

 ストア登録自体は一般的なものと同じですが、申請オプションの項目にある制限付き機能については、下記のようなコメントを記載します。

デスクトップアプリのブリッジを使ったAppPackage化によるストア登録なのでrunFullTrustが必要です。
Because it is a store registration by AppPackage using the bridge of the desktop application, runFullTrust is necessary.

 あとは申請に提出してストアに公開されるのを待つだけです。

以前とは異なり数時間くらいで審査通過してストア公開フェーズになります。

ストア公開フェーズになってから実際に公開されるまで数時間待たされるので翌朝には公開されているかなくらいの感覚でいるとイライラしないでしょう。

もちろんストア公開なので有料アプリもサクッと指定ができてアプリ費用もMSさんが回収してくれる(マージンは取られるけれど)ので、これはっ!というUnityアプリを登録してみるのもいいでしょう!