Hiromuブログ

最近はこちら(https://zenn.dev/hiromu)が本体

Windowsストアへの申請

HoloLensのアプリGuitarScaleMRをリリースしました。

300x300

概要としてはギターのスケールを自由な位置に表示するものです。

以前、以下のようなツイートをしたのですがブラウザだと縦置き表示しかできず、少し不便に感じたため自由な位置・向きに表示できるようアプリ化してみました。



ストアへのリリース作業についてはMicrosoft MVP ゆーじさんの以下サイトが非常に参考になります。

参考:WindowsストアにHoloLensアプリをリリースする手順まとめ


ので、以下に今回作業を行ってみてのちょっとした補足とアプリの実装に関して記載します。

リリース作業

アイコン、スプラッシュイメージ

以前はUWP Logo Makerを利用することで必要なアイコンを生成していたようですが、現在はUnityのメニューにHoloToolkit –> Tile Generatorがあり、1240x1240のアイコンと2480x1200のスプラッシュイメージがあれば大丈夫です。Update Iconsボタンを押すことで必要なサイズの画像生成と、配置も自動でされました(便利!)。

tilegenerator

ただし、VisualStudioで1つだけ画像のサイズエラーが出ていたため手動で直しました。

06b_error

Windowsアプリ認定キット

Windowsアプリ認定キットは現状ではもしかしたら対応しているかもしれないと思い念のため調べましたが、

「Running the Windows App Certification Kit on a remote HoloLens is not currently supported.」

とのことで2017/09/01現在でも対応していないようです。

Windows App Certification Kit


日程感

  • 2017/08/25(金) 07:25 申請
  • 2017/08/29(火) 06:36 認証(この時間にRATING CERTIFICATEというメールが届いていた)
  • 2017/09/01(金) 19:12 ストアに掲載(実際はもう少し早い段階からストアには並んでいたがメールが届き、ステータスが「ストア内」に変わったのはこの時間)

認証されてからすぐ公開されるかと思っていましたが、結構時間がかかりました。

アプリの認定プロセスによると、

「アプリの潜在的なすべてのユーザーが新しいパッケージと内容の詳細を利用できるようになるまでには最大 16 時間かかる可能性があり、それまでアプリは公開フェーズのままです。 」

とのことで、またUWPアプリの公開で同じ経験をされた方が過去にサポートに問い合わせた内容によると、

「>承認後すべてのシステムに情報が反映されるまで24 – 72 時間ほどかかります。 」

とのことです。


今回84時間ほどかかりました、現実は過酷だ。認証からストアに掲載されるまでの時間は人によってまちまちみたいなので、気長に待つのがよいと思います。


アプリ実装

実装のポイントとしては、ユーザ動作への追随、音声コマンド、ボタン処理あたりかと思います。

ユーザ動作への追随

[HoloLens]ユーザ動作へ追随するオブジェクト

上記のRadialViewSolverを利用しました。またヘルプの表示にはFitboxを利用しました。


実際動かしてみての感想は(パラメータにもよるかもしれませんが)RadialViewSolverは動きがぎこちないなと。。。

Fitboxに使われているInterpolatorを利用した動きが滑らかでいい感じです。


音声コマンド

[HoloLens]音声認識のKeywordManagerがDeprecatedになっていた

上記で調べたMRDesignLabsの部品を利用してもよかったのですが、今回はUnity 標準のライブラリを利用した方法で実装しました。

参考:HoloLens アプリ開発備忘録


ボタン処理

ボタンはMRDesignLabsのSpriteButtonプレハブを利用しました。

少しだけ工夫した点として、一番右のピンアイコンについてはトグル表示となるようにしました。SpriteButton.csをみると各状態におけるスプライトがpublicで取得できるようになっていたので以下のようなスクリプトで変更しています。

pin_uppin_down


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IconChanger : MonoBehaviour {
    public Sprite PinUpSprite;
    public Sprite PinDownSprite;
    SpriteRenderer render;
    HUX.Buttons.SpriteButton.SpriteButtonDatum[] btn_states;

    void Start () {
        render = GetComponent();
        btn_states = GetComponent().ButtonStates;
    }
    
    public void ChangeIcon(bool solver)
    {
        if(solver == false)
        {
            render.sprite = PinDownSprite;
            foreach(var s in btn_states)
            {
                s.ButtonSprite = PinDownSprite;
            }
        } else
        {
            render.sprite = PinUpSprite;
            foreach(var s in btn_states)
            {
                s.ButtonSprite = PinUpSprite;
            }
        }
    }
}


以上になりますが、もしよろしければご利用ください。