- 2017/12/04 【Unity】Androidのハードウェア音量操作・ハードウェアキーの無効化をする
- 2017/08/30 【Unity】Amazonアプリストアに申請する
« prev next »
【Unity】Androidのハードウェア音量操作・ハードウェアキーの無効化をする 
2017/12/04 Mon [edit]
これは音量操作のプラグインのアップデート版となる。以前の記事にはプラグインの内部的なコード(Java)や仕様説明を書いたので、今回は Unity 側のコードやプレファブの使い方などを中心に書いておこう。プラグイン自体のセットアップからはじめる場合は、以前の記事を参照して欲しい。
|
■ハードウェア音量操作する際の AndroidManifest.xml について
■HardVolumeController(プレファブ)の使い方
■HardVolumeController のセットアップ例
■スクリプトでハードウェア音量操作・取得などをする
●ハードウェア音量を取得する [メディア音量のみ]
●ハードウェア音量を設定・増減をする [メディア音量のみ]
●ハードウェアボタン押下による、端末自身での音量操作を有効/無効化する
●ハードウェアボタン押下のイベントを取得するリスナーを登録する
■更新履歴
(※) Unity 5.6.3p1 / AndroidStudio 2.3.3 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認
■ハードウェア音量操作する際の AndroidManifest.xml について
プラグインのセットアップにも書いてあるが、ここではもう少し詳細に解説しておこう。ハードウェア音量ボタンを押したときのイベントを取得する際には Unity で通常使われるアクティビティ「UnityPlayerActivity」をオーバーライドした、「HardVolKeyOnUnityPlayerActivity」(ハードウェア音量イベント取得用アクティビティ:プラグイン内に入っている)または「FullPluginOnUnityPlayerActivity」(プラグイン機能のすべてが入っている)を使う必要がある。これらのアクティビティ(Activity)はこのプラグイン独自のアクティビティで、ハードウェアキーのイベントを監視するコードが含まれている(初期のバージョンではあるが、Java コードは以前の記事に掲載してある)。インポートした「Assets/Plugins/Android/」にはマニフェストファイルのテンプレとして「AndroidManifest-HardVolKey~.xml」または「AndroidManifest-FullPlugin~.xml」が含まれているので、これらの中から適切なものを選んで(「縦置き・横置き」とか「API Level」とか)、「AndroidManifest.xml」にリネームしてビルドすることで利用することが可能になる。音量の取得・増減だけなら特別な権限はいらないので、使用するアクティビティさえ指定すれば、独自に書き換えても構わない。

なお、ハードウェアボタンのイベントを受け取らず、Unity から一方的に音量を設定するだけなら、オーバーライドしたアクティビティを使う必要はない。具体的には例えば、後述する「GetMediaVolume()」「SetMediaVolume()」「AddMediaVolume()」(ハードウェア音量[メディア音量のみ]の取得と設定)のみの使用なら、これらマニフェストファイルは必要ない(Unity がデフォルトのマニフェストファイルを用意してくれる)。
(※) 独自のマニフェストファイルでビルドすると警告「Unable to find unity activity in manifest. You need to make sure orientation attribute is set to sensorPortrait manually.」が出るが、「UnityPlayerActivity」以外のアクティビティを使うと出るものなので気にしなくて良い(orientation=画面回転はUnity側のアプリの設定に合わせた方が良い)。
■HardVolumeController(プレファブ)の使い方
サンプルシーンにも含まれている「HardVolumeController.prefab」はスクリプト「HardVolumeController.cs」をアタッチしたハードウェア音量操作をするプレファブである。同じように「HardVolumeControllerWithToast.prefab」「HardVolumeControllerWithToast.cs」というものも入っているが、これらは音量が操作されたときにプラグインでトースト(Toast)で現在音量を表示する機能を追加しただけのものである。つまり音量の表示方法以外は内容的に変わらないので、例ではどちらの場合でも置き換えて考えて欲しい。
端末と連携してこれらプレファブを利用するには、オプションの設定とコールバックを上手く使う必要がある。少しその辺は紛らわしいので、その解説と設定例などをなるべく詳細に書いておこう。

●オプション設定やコールバックの説明
Enable Hard Key | このスクリプトからは常にハードウェアの音量操作はできるのだが(Unity → Android)、端末のハードボタンを押したときにもスクリプトを利用するか否かの設定(Android → Unity[→何らかの動作])をするオプションとなる。別の言い方をすれば、「端末のハードボタンを押したときのイベントを受け取るか否か」と同義だ。端末のハードボタンと連携したいときはオンにする必要がある。オンにしたとき、端末のハードボタンで音量大を押すと Android → Unity へ "VolumeUp" メッセージ(文字列)が送られ、コールバック:OnHardVolumeKeyUp() が呼ばれる。同じようにハードボタンで音量小を押したときは Android → Unity へ "VolumeDown" メッセージが送られ、コールバック:OnHardVolumeKeyDown() が呼ばれる。インスペクタでこれらコールバックに何らかのメソッドを登録しておけば、端末のハードボタンを操作したとき独自のアクションが設定できる。オフにしたときは、端末のハードボタンのイベントを無視するので、端末側で操作したときの影響は受けない(端末での操作とは別々になる)。デフォルトはオフ(Unityでの操作、端末での操作は別々に行える)。 |
---|---|
Hard Operation | 端末のハードボタンを押したとき、端末自身での音量操作をするか否かのオプション。オフにすると端末自身での音量操作は無効となり、Unity 側だけの音量操作となる。「Enable Hard Key」をオンにすることでハードボタン押下のイベントは受け取れるので、「Hard Operation=オフ+Enable Hard Key=オン」の組み合わせで「Android 端末で音量無効→イベントだけUnityで受け取る→コールバックでUIなどを表示→UnityからAndroidへ音量設定」のような流れを作ることで Unity 側でのハード音量操作を完全に制御できる。逆に「Hard Operation=オフ+Enable Hard Key=オフ」にするとユーザーは音量操作が全くできなくなってしまうので注意。デフォルトはオン(Android端末側でも音量操作は可能)。 |
Show UI | Unity で音量操作を行ったとき、端末のシステムUIを表示するか否かのオプション。あくまで Unity 側からの操作のときのみなので、端末自身のハードボタンで操作したときには影響しない。 |
On Volume Called(int) (コールバック) | 音量の増減操作や現在の音量取得をしたときのコールバック。通常は UI などの呼び出しに使うと良い。「HardVolumeControllerWithToast」はこのコールバックでトースト(Toast)を呼び出すセットアップがされている。独自の UI などを作成したときはここにその表示メソッドを登録すれば良いだろう。引数の値(整数)は操作後の音量となる。 |
On Hard Key Volume Up (コールバック) | 端末のハードボタンで音量が上げられたときのコールバック。ハードボタン押下のイベントを受け取る必要があるので「Enable Hard Key=オン」である必要がある。「Hard Operation=オフ」のときは、端末自身で音量操作ができなくなるため、ここに音量アップのメソッドを登録すると良い(HardVolumeController.VolumeUp() でも良い)。「Hard Operation=オン」のときは、端末自身で音量操作ができるため、現在音量の表示だけで良いだろう(HardVolumeController.VolumeNow() 等)。逆にハードボタンを無視するならば登録する必要はない。 |
On Hard Key Volume Down (コールバック) | 端末のハードボタンで音量が下げられたときのコールバック。ハードボタン押下のイベントを受け取る必要があるので「Enable Hard Key=オン」である必要がある。「Hard Operation=オフ」のときは、端末自身で音量操作ができなくなるため、ここに音量アップのメソッドを登録すると良い(HardVolumeController.VolumeDown() でも良い)。「Hard Operation=オン」のときは、端末自身で音量操作ができるため、現在音量の表示だけで良いだろう(HardVolumeController.VolumeNow() 等)。逆にハードボタンを無視するならば登録する必要はない。 |
■HardVolumeController のセットアップ例
言葉で説明すると少し難しく感じるので、簡単なセットアップ例を掲載しておこう。サンプルのシーンには微妙に異なったセットアップのプレファブが配置してあるので、動作確認して自分の使いたい機能に近いものを利用するのも良いだろう。
(例1)端末自身のハードボタン・Unity ともに音量操作をしたとき、端末のシステムUIとトースト(Toast)が表示されるセットアップ。
(※)サンプルのシーン「Assets/_Test/Scenes/PluginTest」に配置してある。

Hard Operation → 端末自身での音量操作も可能とする。
Show UI → Unity で音量操作をしたときも端末のシステムUIを表示する。
On Volume Called → Unity, 端末自身ともに音量操作したとき、トーストを表示する。
On Hard Key Volume Up →ハードボタンで音量を上げるイベントを受信したとき、現在音量を表示する(→トーストで表示される)。
On Hard Key Volume Down → ハードボタンで音量を下げるイベントを受信したとき、現在音量を表示する(→トーストで表示される)。
(例2)端末のハードボタンが押されたとき、Unity で独自の UI にて現在音量を表示し音量操作をする。また端末のシステムUIは表示しないセットアップ。
(※)サンプルのシーン「Assets/_Test/Scenes/DialogExTest」に配置してある。

(※)「VolumeUI」は独自のUI(uGUI)
Hard Operation → 端末自身での音量操作を無効化する(システムUIを表示させない)。
Show UI → Unity で音量操作をしたときに端末のシステムUIを表示しない。
On Volume Called → Unity, 端末自身ともに音量操作したとき、独自UIを表示する。
On Hard Key Volume Up → ハードボタンで音量を上げるイベントを受信したとき、Unity で端末の音量を上げる。
On Hard Key Volume Down → ハードボタンで音量を下げるイベントを受信したとき、Unity で端末の音量を下げる。
■スクリプトでハードウェア音量操作・取得などをする [メディア音量のみ]
以前の記事にもコードは掲載してあるが、ここでは改めて機能ごとに分けて書いておこう。
●ハードウェア音量を取得する [メディア音量のみ]
using FantomLib;
#if UNITY_ANDROID && !UNITY_EDITOR
int vol = AndroidPlugin.GetMediaVolume(); //現在音量の取得
int max = AndroidPlugin.GetMediaMaxVolume(); //最大音量の取得
#endif
//HardVolumeController を使用するなら(内容は全く同じ)
HardVolumeController hardVolumeController = FindObjectOfType<HardVolumeController>();
int vol = hardVolumeController.volume; //現在音量の取得
int max = hardVolumeController.maxVolume; //最大音量の取得
●ハードウェア音量を設定・増減をする [メディア音量のみ]
using FantomLib;
#if UNITY_ANDROID && !UNITY_EDITOR
int vol = AndroidPlugin.SetMediaVolume(4, showUI); //音量=4
vol = AndroidPlugin.SetMediaVolume(0, showUI); //ミュート:音量=0
vol = AndroidPlugin.AddMediaVolume(1, showUI); //現在の音量+1
vol = AndroidPlugin.AddMediaVolume(-1, showUI); //現在の音量-1
#endif
//HardVolumeController を使用するなら(内容は全く同じ)
HardVolumeController hardVolumeController = FindObjectOfType<HardVolumeController>();
hardVolumeController.volume = 4; //音量=4
hardVolumeController.VolumeMute(); //ミュート:音量=0
hardVolumeController.VolumeUp(); //現在の音量+1
hardVolumeController.VolumeDown(); //現在の音量-1
●ハードウェアボタン押下による、端末自身での音量操作を有効/無効化する
using FantomLib;
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidPlugin.HardKey.SetVolumeOperation(true); //端末自身での音量操作が可能
AndroidPlugin.HardKey.SetVolumeOperation(false); //端末自身での音量操作を無効化
#endif
//HardVolumeController を使用するなら(内容は全く同じ)
HardVolumeController hardVolumeController = FindObjectOfType<HardVolumeController>();
hardVolumeController.HardOperation = true; //端末自身での音量操作が可能
hardVolumeController.HardOperation = false; //端末自身での音量操作を無効化
●ハードウェアボタン押下のイベントを取得するリスナーを登録する
using FantomLib;
void OnEnable() //MonoBehaviour イベント
{
#if UNITY_ANDROID && !UNITY_EDITOR
//ハードウェア音量キーのリスナー登録("HardVolumeKeyChange"はコールバックハンドラ)
AndroidPlugin.HardKey.SetKeyVolumeUpListener(gameObject.name, "HardVolumeKeyChange", "VolumeUp");
AndroidPlugin.HardKey.SetKeyVolumeDownListener(gameObject.name, "HardVolumeKeyChange", "VolumeDown");
#endif
}
void OnDisable() //MonoBehaviour イベント
{
#if UNITY_ANDROID && !UNITY_EDITOR
//ハードウェア音量キーの全リスナー解除
AndroidPlugin.HardKey.RemoveAllListeners();
#endif
}
//ハードウェア音量キーのイベントハンドラ(Android ネイティブから呼ばれる)
void HardVolumeKeyChange(string message)
{
if (message == "VolumeUp")
{
//音量を上げる操作されたときの処理
}
else if (message == "VolumeDown")
{
//音量を下げる操作されたときの処理
}
}
//※内容は「HardVolumeController.cs」と同じもの。
サンプルコードは「Assets/FantomLib/Scripts/Module/HardVolumeController.cs」にまとまっているので適当にコピペしたり、継承して新しいクラスを作るのも良いだろう。またプレファブ「Assets/FantomLib/Prefabs/System/HardVolumeControllerWithToast」にはトースト(Toast)で操作したときの音量を表示できるようにセットアップしてある。少し改造すればVR(Cardboard/ハコスコ)にも応用できるだろう。シーン「PluginTest」「DialogTest」「DialogExTest」にはそれぞれ異なったセットアップのプレファブが配置がされているので、自分の好みに合ったものを利用するのも良いだろう。
|
※この記事のUnityアセットはプラグインとして配布されています。
※とりあえず試してみたい方は、最新版をビルドした apk デモをダウンロードできます。動作確認にもどうぞ。


Android 4.2以上
※「提供元不明アプリのインストール」許可が必要です。
(関連記事)
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】Androidでカスタマイズしたダイアログを動的生成できるプラグインを作ってみた
【Unity】Androidでスライダーで設定を変更するダイアログを使う
【Unity】Androidでスイッチで設定を変更するダイアログを使う
【Unity】Androidの選択ダイアログを使う
【Unity】Androidで日付・時刻選択ダイアログ(DatePicker, TimePicker)を使う
【Unity】Androidで数値・半角英数・パスワード入力ダイアログを使う
【Unity】Androidでテキスト入力ダイアログを使う
【Unity】Androidのテキスト読み上げ(TextToSpeech)を使う
【Android】【Java】AlertDialog を使ってみる
- 関連記事
-
-
【Unity】【C#】音量設定用にデシベル(dB)変換をする
-
【Unity】【C#】SDクエリちゃんを目パチさせる
-
【Unity】【C#】KeyCode をリアルタイムで調べる / Windows 日本語キーボードでの記号の KeyCode 一覧
-
【Unity】【Android】自動バックアップの対象/除外設定をする
-
【Unity】IncrementalCompiler でのエラー:Unloading broken assembly Packages/com.unity.incrementalcompiler/Editor/Plugins/Unity.PureCSharpTests.dll, this assembly can cause crashes in the runtime
-
category: Unity
thread: ゲーム開発
janre: コンピュータ
tag: Unityライブラリ Unityプラグイン FantomPlugin Cardboard VR【Unity】Amazonアプリストアに申請する 
2017/08/30 Wed [edit]
今度は Unity で「Google Cardboard/ハコスコ」で楽しめるスマホ用VRアプリをビルドしてAmazon AppStore に申請してみた。というより先日 Oculus Store に申請した GearVR アプリは、元々 Cardboard 用に作ったアプリだったので、こちらも試しにアップしてみるのも良いかと思っただけだったりする(てゆか最近まで個人でも Amazon AppStore から配信できることを知らんかった(笑))。
やってみた感想は、たぶんこれまでで一番簡単だった。バイナリ(apk)のチェックなどは完全自動化されているようだし、そもそもアプリ動作に対する要件が特にないので(例えば「バックボタンで終了しろ」みたいな)、画像を揃えるだけで申請できた。また Google Play で公開されているものをそのまま使っても良いようなので(ただし、Google の API は使えないので、Amazon の API に入れ替える必要あり)、既にアプリ公開している人でもリーチを広げるのには良いかも知れない。デベロッパー登録から申請まで全て無料でできるので試してみるのも一興かと(笑)。
(※) Unity 5.6.2p3 / Windows10(x64) で確認
■Amazon AppStore 申請の大まかな流れ
まずは既存の apk があるのなら、デベロッパーサイトにある「テストを始める」にその apk ファイルをドラッグ&ドロップしてみるのも良いかも知れない。申請時にも同じように apk をアップロードできる画面があるが、ここにドロップした場合は、デベロッパー登録なしでもテストできる。問題がなければ、そのまま申請の手続きの画面に移ることも可能だ(結果の履歴から申請登録することもできる)。
デベロッパー登録がまだならアカウントを作成する必要があるが、それが完了したら即申請もできる。以下に簡単な申請までの流れを書いておこう。
1.デベロッパー登録をする。税に関する情報入力(課金アプリにする場合や広告などを使うときの税徴収に関する電子公文書)は少し面倒だが、無料にする場合も必要らしい。認証は小一時間もすれば完了する。
2.デベロッパーサイトの「ダッシュボード」または「アプリ&サービス」の「新規アプリを追加」でアプリを登録できる。アプリの情報入力および画像アセット、バイナリ(apk)をアップロードする。また、ドラッグ&ドロップのテストをした場合は結果の履歴が残っているので、そこから登録もできる(最新版は一番上)。
3.自動チェック(画像アセットが揃っている、アプリの問題チェック通過)が済んだら、Amazon AppStore に申請する(すべてが完了したら「アプリを申請」が押せるようになる)。
4.申請後はしばらく審査待ちになる(最大1週間とあるが、早ければ1日でリリースできる)。
5.審査をパスしたら、今度はリリース待ちになる(リリース日は情報入力で設定した日。未入力なら審査パス後にすぐ)。
ちなみに私の場合、リリース日は特に指定しなかったせいもあり、約6時間後にはリリースされていた。はやっ!
■Amazon AppStore 申請要件の概要(主に画像アセット)
ここでは必要なアセット(主にストア用画像)をまとめておく。細かい内容は FAQ に書かれているので、簡単に目を通しておくと良いだろう。
●提出するアセットの仕様(※画像のサイズなど)
・小アイコン:114 x 114px PNG (背景色透明)(アプリをインストールした後、端末に表示されるアイコン)
・大アイコン(サムネイル):512 x 512px PNG (背景色透明)(アイコンと同一の画像であること)
・スクリーンショット:3~10 枚まで:PNG または JPG。使用できるサイズは、
800 x 480px (5:3), 1024 x 600px (128:75), 1280 x 720px (16:9), 1280 x 800px (8:5),
1920 x 1080px (16:9), 1920 x 1200px (8:5), 2560 x 1600px (8:5)
のいずれか(縦長または横長)
・プロモーション用画像 (推奨):1024 x 500px (256:125) (横長のみ) PNG or JPG
・動画:最大5 MPEG-2, WMV, MOV, FLV, AVI, H.264 MPEG-4
最小幅720px (4:3 or 16:9); 高さ1200 kbps以上
(参考)
・アプリの申請:アプリの詳細
■アプリの Build Settings
Amazon AppStore にはあまり技術的な要件はないみたいだが、一応今回のビルド設定も載せておこう。ここでは Cardboard アプリを例にしているが、基本的に普通のアプリでも変わらないので、特に気をつける部分は API Level や CPU の設定くらいかも知れない。実際には申請時の登録情報にサポートしている端末を選択することができるので、既存のままでもかまわない。Fire タブレットなどにも対応させるなら「Android 5.1 Lollipop API Level 22」あたりにしておけば良いらしい(持ってないので未実証だが、アプリテストを信頼するとして(笑))。

あとはテクスチャの圧縮を使うなら「OpenGL ES」のバージョンくらいか。「OpenGL ES 2.0」なら間違いないが、「OpenGL ES 3.0」なら「Android 4.3 (API level 18)」以上を、「OpenGL ES 3.1」なら「Android 5.0 (API level 21)」にしておく必要がある。以下にいくつか参考URLを載せておこう。
(参考)
・Android プラットフォームのバージョン
・OpenGL ES
・Unityで画像fを圧縮する際のフォーマットのお話し(ASTCとETC)

「Quarity Settings」なども任意で良いが、私は GearVR の設定のときと同じものを使っている。パフォーマンスが許すなら「Anti Aliasing」(アンチエイリアス処理)を「2x MultiSampling」以上にしても良いだろう。モバイルの場合、警告「Warning! Using antialiasing on a mobile device may decrease performance severely. You can change the mobile quality settings in 'Project Settings -> Quality Settings'.」(モバイルではアンチエイリアス使うとパフォーマンス下がるよ)が出るが、Android 5.0 (API 21) 以上ならわりといけるようだ。
■アプリのアップデート
一番簡単な方法は申請の流れのときと同じように「テストをはじめる」に新しいバージョンのアプリをドロップし、「Test Results available」が出たら「View Results」(or 結果を表示)をクリックし、テストの履歴から「AppStore に提出」を押すことだろうか。提出ボタンを押すと「アプリには既にバイナリが含まれています。バイナリを置き換えますか?」とダイアログが出るが「YES」を押し、登録を保存すれば良い。あとは既存の情報を編集したり、リリースノートを書けば申請できるようになる。
これははじめ戸惑ったのだが、メニューの「次バージョン」を押しても同じ画面になるが、「保存してバイナリを追加」は「既存をそのまま+新しいのを追加」のようになってしまうようだ。また、なぜかバイナリ(binary2)の自動チェックがされず、サポート端末が未設定になる。「バイナリを削除→追加」でも良いかもしれないが、先に述べたテスト結果からそのまま置き換え→提出した方が楽だ。
(関連記事)
【Unity】GearVR アプリを Oculus Store に申請する(要件・仕様の概要)
【Unity】GearVR 用にビルドする

| h o m e |