HoloLensのアプリGuitarScaleMRをリリースしました。
概要としてはギターのスケールを自由な位置に表示するものです。
以前、以下のようなツイートをしたのですがブラウザだと縦置き表示しかできず、少し不便に感じたため自由な位置・向きに表示できるようアプリ化してみました。
思い付きで、昔作ったサイト(https://t.co/1sbpTopjA9)を見ながらHoloLensでスケールをカンニングして弾いてみた。結構ありだと思うけど、動画はギターを無理やり写すために変な体勢で弾いてるw
— キャット (@hi_rom_) 2017年8月5日
ご家庭の事情により音もしょぼい(´・ω・`) pic.twitter.com/QZb9gEdsOM
ストアへのリリース作業についてはMicrosoft MVP ゆーじさんの以下サイトが非常に参考になります。
参考:WindowsストアにHoloLensアプリをリリースする手順まとめ
ので、以下に今回作業を行ってみてのちょっとした補足とアプリの実装に関して記載します。
リリース作業
アイコン、スプラッシュイメージ
以前はUWP Logo Makerを利用することで必要なアイコンを生成していたようですが、現在はUnityのメニューにHoloToolkit –> Tile Generatorがあり、1240x1240のアイコンと2480x1200のスプラッシュイメージがあれば大丈夫です。Update Iconsボタンを押すことで必要なサイズの画像生成と、配置も自動でされました(便利!)。
ただし、VisualStudioで1つだけ画像のサイズエラーが出ていたため手動で直しました。
Windowsアプリ認定キット
Windowsアプリ認定キットは現状ではもしかしたら対応しているかもしれないと思い念のため調べましたが、
とのことで2017/09/01現在でも対応していないようです。
日程感
- 2017/08/25(金) 07:25 申請
- 2017/08/29(火) 06:36 認証(この時間にRATING CERTIFICATEというメールが届いていた)
- 2017/09/01(金) 19:12 ストアに掲載(実際はもう少し早い段階からストアには並んでいたがメールが届き、ステータスが「ストア内」に変わったのはこの時間)
認証されてからすぐ公開されるかと思っていましたが、結構時間がかかりました。
アプリの認定プロセスによると、
とのことで、またUWPアプリの公開で同じ経験をされた方が過去にサポートに問い合わせた内容によると、
とのことです。
今回84時間ほどかかりました、現実は過酷だ。認証からストアに掲載されるまでの時間は人によってまちまちみたいなので、気長に待つのがよいと思います。
アプリ実装
実装のポイントとしては、ユーザ動作への追随、音声コマンド、ボタン処理あたりかと思います。
ユーザ動作への追随
上記のRadialViewSolverを利用しました。またヘルプの表示にはFitboxを利用しました。
実際動かしてみての感想は(パラメータにもよるかもしれませんが)RadialViewSolverは動きがぎこちないなと。。。
Fitboxに使われているInterpolatorを利用した動きが滑らかでいい感じです。
音声コマンド
[HoloLens]音声認識のKeywordManagerがDeprecatedになっていた
上記で調べたMRDesignLabsの部品を利用してもよかったのですが、今回はUnity 標準のライブラリを利用した方法で実装しました。
ボタン処理
ボタンはMRDesignLabsのSpriteButtonプレハブを利用しました。
少しだけ工夫した点として、一番右のピンアイコンについてはトグル表示となるようにしました。SpriteButton.csをみると各状態におけるスプライトがpublicで取得できるようになっていたので以下のようなスクリプトで変更しています。
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;
}
}
}
}
以上になりますが、もしよろしければご利用ください。