ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »Unity
カテゴリー「Unity」の記事一覧

【Unity】標準以外のセンサー(歩数計や心拍数など)を使う(Android)  


 せっかくなので、Android で Unity の標準センサー(Input.acceleration, compass, gyro)以外のセンサーを使う方法を書いておこう。またついでに Android のセンサーの値の仕様も覚えておくと、新しいセンサーが搭載されたときにも役に立つかも知れない。あと、センサーの利用にはその端末がそのセンサーを搭載しているか、パーミッションが与えられているかなどという注意点もあるので覚えておこう。



 センサーのデモシーンは「SensorTest」(AssetStore版は「Assets/FantomPlugin/Demo/Scenes/」以下、GoogleDrive版は「Assets/_Test/Scenes/」以下)にまとまっているので、コピペして使うのも良いだろう。プラグイン自体が無い場合は以下から GoogleDrive版をダウンロードしても良い。

>>プラグイン&サンプルをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)


 プラグインのセットアップから始める場合には以前の記事を参考にして欲しい。AssetStore版を利用してる場合はこちらの記事を、GoogleDrive版を利用している場合はこちらの記事を参照して欲しい。どちらもコード自体は同じなので同じように使えると思う。パスなどの違いは適宜置き換えて考えて欲しい。


(※) Unity 5.6.3p1 - 2017.3.0f3 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認



■歩数センサー(Step Counter Sensor)を使う

 歩数センサーは歩く度にカウントアップされるセンサーだ。いわゆる歩数計である。大まかにはあらかじめ用意してあるプレファブを利用する方法とスクリプトを書く方法があるが、両方解説しておこう。基本的にはプレファブとその「~Controller」スクリプトを使う方が簡単だろう。自分で細かく制御したいときには直接スクリプトを書く感じにすれば良いと思う。

 ちなみに歩数センサーはある程度の速度で歩かないと検知しないようだ。ゆっくり歩いたり、あまり揺れないように動いたりすると反応しない。端末に搭載されているハードによっても違うらしいので、センサーを扱う場合はある程度値にレンジ幅を持たせた方が良いだろう(例えば照度センサーとか近接センサーなどは結構違うらしいので、きっちりした値で判別などすると、端末によって違う挙動になってしまう)。



●プレファブ「StepCounterSensorController」の利用

 AssetStore版は「Assets/FantomPlugin/FantomLib/Prefabs/Sensors/」以下、GoogleDrive版は「Assets/FantomLib/Prefabs/Sensors/」以下にプレファブ「StepCounterSensorController」があるのでヒエラルキーに置こう。

 以下はデモシーン「SensorTest」に使っているプレファブのキャプチャだが(掲載時点:ver.1.9)、簡単にパラメータの説明を書いておこう。


Sensor Delayセンサーの検出速度定数。具体的な速度は以下のようになっているが、実際には「可能であればより速く」受信される。センサーによっては常に一定のものもある。基本的にセンサー取得は高負荷なので、速度に問題ないなら遅い方が良い(※「Normal」推奨)。
・Fastest:0ms
・Game:20ms (50fps)
・UI:66.6ms (15fps)
・Normal:200ms (5fps)
Start Listening On EnableUnity のライフサイクル OnEnable() で自動的に開始される。このオプションに関わらず OnDisable(), OnDestroy(), OnApplicationQuit() では停止される。
On Sensor Changedオリジナルのセンサーの値のコールバック。Android から送られてくる値そのままである。歩数センサーの場合、OS がリブートされてからのカウント数が返される(センサーを稼働している全アプリ共通となる)。詳細は後述を参照
On Errorエラー時のコールバック。起動時(Start())に歩数センサーがサポートされてなかったら、エラーメッセージ「Not Supported: (センサーの種類)」が返される
On Step Counter Sensor Changed適宜変換されたセンサーの値のコールバック。歩数センサーの場合、スクリプトが実行されてからの歩数となる。int 型に変換されている。

 プレファブを利用する場合はヒエラルキーに置いてインスペクターで設定するだけだ。大ざっぱには「Start Listening On Enable」をオンにするか否かとコールバックを登録するくらいだろう。コールバックの値は「On Sensor Changed」「On Step Counter Sensor Changed」のどちらを使っても構わないが、アプリで実行してからの歩数を取得するなら「On Step Counter Sensor Changed」の方が簡単だろう。センサー系のプレファブには必ず2つの値を返すコールバックがあるが、元の値が「On Sensor Changed」、便宜上簡単に扱える値に変換(型なども)したものがもう1つのコールバックと考えて良い。



●スクリプト(StepCounterSensorController)での利用

 クラス「StepCounterSensorController」を利用する場合は、おおよそ以下のように使うと考えて良い。簡略したものを書いておくので、適宜修正して手を加えて欲しい。

using FantomLib;

//※実際には FindObjectOfType は負荷の高い関数なので、インスペクタで予め登録できるようにしておくなど工夫した方が良いかも。
StepCounterSensorController stepConter = FindObjectOfType<StepCounterSensorController>();
if (stepConter != null && stepConter.IsSupportedSensor) { //サポートのチェック
stepConter.StartListening(); //取得開始
}

if (stepConter != null && stepConter.IsSupportedSensor) { //サポートのチェック
stepConter.ResetCount(); //0にする(OnStepCounterSensorChanged にのみ反映)
}

if (stepConter != null && stepConter.IsSupportedSensor) { //サポートのチェック
stepConter.StopListening(); //取得停止
}

 なお、「~Controller」は一連の機能をまとめただけのものなので、AndroidPlugin を直接使う場合には以下のようになる。それぞれのコードは何らかのメソッドなどに書いてあると考えて欲しい。

using FantomLib;

//取得開始処理
#if !UNITY_EDITOR && UNITY_ANDROID
if (AndroidPlugin.IsSupportedSensor(SensorType.StepCounter)) { //サポートのチェック
AndroidPlugin.SetSensorListener(SensorType.StepCounter, SensorDelay.Normal, gameObject.name, "ReceiveValues");
}
#endif

//取得停止処理
#if !UNITY_EDITOR && UNITY_ANDROID
if (AndroidPlugin.IsSupportedSensor(SensorType.StepCounter)) { //サポートのチェック
AndroidPlugin.RemoveSensorListener(SensorType.StepCounter);
}
#endif

//値の取得(コールバックハンドラ)
void ReceiveValues(string json)
{
if (string.IsNullOrEmpty(json))
return;

SensorInfo info = JsonUtility.FromJson<SensorInfo>(json); //JSONから変換
if (info.type == (int)SensorType.StepCounter) {
//info.values(OS がリブートしてからの歩数:float 型)
//を用いて何らかの処理など
}
}

//センサーの解放
#if !UNITY_EDITOR && UNITY_ANDROID
AndroidPlugin.ReleaseSensors();
#endif

 センサーの値は Android から Unity へ JSON の形式で送られる。そのフォーマットはセンサーの種類(int 型)とその値(float 型の配列)となっている。JSON 変換してるために余計負荷は高くなるので、Unity で標準的に使えるセンサー(Input.acceleration, compass, gyro)があったらそちらを使った方が良いだろう。ただし同じセンサーでも値は違ったりするので(型、ベクトルと四元数、符号など)注意して欲しい。詳細は後述の「センサーの値の仕様」や公式のデベロッパーマニュアルを参照して欲しい。

 なお、プラグインでのセンサーリスニング(SetSensorListener)のコールバック登録は1つのみとなる。複数登録できないので注意して欲しい(常に上書きになるため、最後のものが有効になる)。複数のメソッドをコールバックハンドラにしたい場合は、インスペクタのコールバック(UnityEvent)に複数のメソッドを登録すれば良い。



■心拍数センサー(Heart Rate Sensor)を使う

 心拍数(HeartRate)センサーは端末の裏に指を当てることによって(Galaxy S7 Edge の場合、裏面のカメラの横にあるセンサーに指を近づけると赤く光るので、そこにしばらく指を置く)心拍数(単位:bpm)を計測するセンサーである。他にも「HeartBeat」センサーというものもあるが、こちらは心拍数のピークを検出するものらしい(Galaxy S7 Edge には搭載されてないので未確認。一番高い心拍数を検出?)。

 心拍数センサーを使う場合は、端末に搭載しているか否かもだが、それとは別に「バイタルサインの取得」パーミッションも必要になる。パーミッションが必要なものはアプリ起動時に以下のような確認メッセージが出るものがあるので注意しよう。また Google Play などに公開したときにも権限として表示される。アプリと関係ない権限を付けるとインストールを拒否られる確率も高くなるらしいので、最低限にすることを心がけた方が良いだろう。パーミッションの設定Google Play でのフィルタリングなどは以前の記事に書いておいたので参照して欲しい。

パーミッションの設定
センサー利用時のフィルタリング(Google Play)




●プレファブ「HeartRateController」の利用

 基本的には歩数センサーのプレファブとあまり変わらないので、設定パラメータはそちらを参照して欲しい。違いは「On Heart Rate Sensor Changed」コールバックくらいで、それだけ解説を載せておこう。なお、こちらもデモシーン「SensorTest」に置いてあるプレファブをキャプチャしたものである(掲載時点:ver.1.9)。


On Heart Rate Sensor Changed適宜変換されたセンサーの値のコールバック。心拍センサーの場合、1分間の心拍数[bpm] になる(float 型)。「On Sensor Changed」の values[0] と同じもの。



●スクリプト(HeartRateController)での利用

 考え方は「StepCounterSensor」の場合とほとんど変わらない。「HeartRateController」を利用する場合は、サポートに加えてパーミッションもチェックも加えているだけだ(※実際には心拍数センサーの場合、パーミッションが与えられてないとサポートも不可になる)。簡略したものを書いておくので、適宜手を加えて利用して欲しい。

using FantomLib;

//※実際には FindObjectOfType は負荷の高い関数なので、インスペクタで予め登録できるようにしておくなど工夫した方が良いかも。
HeartRateController heartRate = FindObjectOfType<HeartRateController>();
if (heartRate != null && heartRate.IsSupportedSensor && heartRate.IsPermissionGranted) { //サポートとパーミッションのチェック
heartRate.StartListening(); //取得開始
}

if (heartRate != null && heartRate.IsSupportedSensor && heartRate.IsPermissionGranted) { //サポートとパーミッションのチェック
heartRate.StopListening(); //取得停止
}

 なお、「~Controller」は一連の機能をまとめただけのものなので、AndroidPlugin を直接使う場合には以下のようになる。それぞれのコードは何らかのメソッドなどに書いてあると考えて欲しい。

using FantomLib;

//取得開始処理
#if !UNITY_EDITOR && UNITY_ANDROID
if (AndroidPlugin.IsSupportedSensor(SensorType.HeartRate)
&& AndroidPlugin.CheckPermission("android.permission.BODY_SENSORS")) { //サポートとパーミッションのチェック
AndroidPlugin.SetSensorListener(SensorType.HeartRate, SensorDelay.Normal, gameObject.name, "ReceiveValues");
}
#endif

//取得停止処理
#if !UNITY_EDITOR && UNITY_ANDROID
if (AndroidPlugin.IsSupportedSensor(SensorType.HeartRate)
&& AndroidPlugin.CheckPermission("android.permission.BODY_SENSORS")) { //サポートとパーミッションのチェック
AndroidPlugin.RemoveSensorListener(SensorType.HeartRate);
}
#endif

//値の取得(コールバックハンドラ)
void ReceiveValues(string json)
{
if (string.IsNullOrEmpty(json))
return;

SensorInfo info = JsonUtility.FromJson<SensorInfo>(json); //JSONから変換
if (info.type == (int)SensorType.HeartRate) {
//info.values を用いて何らかの処理など
}
}

//センサーの解放
#if !UNITY_EDITOR && UNITY_ANDROID
AndroidPlugin.ReleaseSensors();
#endif

 他のセンサーでも返ってくる値が違うだけで、やり方は同じようなものなので、色々使ってみると良いだろう。

 以降にはセンサーを利用する際の共通な仕様を書いておくので、一読しておけば自分でスクリプトを組んだり、改造するときなどにも理解しやすいと思う。



■センサーの値の仕様など

 詳細は公式のデベロッパーマニュアルを見て欲しいが、このプラグインでは基本的にセンサーの種類定数(ID:int 型)と取得したセンサーの値の配列(float[] 型)の2つになる。センサーの値に関してはその配列の長さはまちまちで、1つのものもあれば 15個あるものもある。値もトリガー系(だいたい名前が「~Detect」となっている)のものはトリガされたら「1.0」が送られるのみで、待機している間は何も送ってこないものもある。また、端末に搭載されているハードによっても値は異なるので、センサーを扱う場合はある程度値にレンジ幅を持たせた方が良いだろう(例えば照度センサーとか近接センサーなどは結構違うらしいので、きっちりした値で判別などすると、端末によって違う挙動になってしまう → 例えば照度センサーの場合「LIGHT_~」(Constant Value を使う)のように目安が定義されている)。自分で実装するときには注意しよう。

 他にプレファブにもそれぞれのセンサー専用 Controller 以外にも「AndroidSensorController」「AndroidSensorIntController」というものが用意されている(~/FantomLib/Prefabs/Sensors/ 以下)。これらのプレファブも含めて「On Sensor Changed」コールバックの引数はセンサーの値をそのまま返すと考えて良い。「AndroidSensorIntController」の方はセンサーの種類定数が int 型になっているだけで内容は同じだ。SensorType にはデベロッパーマニュアルの値(Constant Value)をそのまま使っているが、例えばウェアラブルデバイスやタブレットなどで特殊なセンサーを搭載している場合には int値で指定すれば取得できることがある(通常のスマホでもデベロッパーマニュアルに載ってない ID のセンサーがいくつか搭載されている。ただしこれらは他のデバイスでは利用できないと考えた方が良い)。

(デベロッパーマニュアル)
各センサーの定数値
各センサーの取得値(values 配列に入る値)

 それ以外にも「AndroidManifest.xml でのパーミッションの設定」や「Google Play に公開する際に、センサー利用のフィルタリング」も合わせて考えておいた方が良いだろう。そのあたりは以前の記事を参照して欲しい。

パーミッションの設定
センサー利用時のフィルタリング(Google Play)


(関連記事)
【Unity】AssetStore版 FantomPlugin のセットアップ
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた


スポンサーサイト

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityプラグイン 
tb: 0   cm: --

【Unity】AssetStore版 FantomPlugin のセットアップ  


 お陰様でアセットストアのバージョンも1.8となり、初期の頃からするとかなりの数の機能を追加してしまったので、改めてセットアップや各機能の仕様、プレファブなどの使い方などを含めて少しずつ記事にしていこうと思う。また、以前書いた記事はどちらかというとプラグイン内部の Java コードを中心に解説しているので、これからは Unity での C# コードの例を中心に解説していこう。


 なお「アセットストア版」と「Google Drive 版」の違いは、元々私が個人的に作っていたのが「Google Drive 版」であり、「アセットストア版」は Unity Asset Store の提出要件に従って内容を置き換えたものになっている。例えばストア版はその要項に「解説は英語であること」「他者の素材は使わないこと(フリー素材等)」「"Plugins"など特殊なフォルダも提出フォルダにまとめて入れること」等があり、その辺りに修正が入れてある(素材も自作した)。しかし、基本的なコードは変わらない。

 また常に最新版は Google Drive に置いてあり、ストア版は英訳したり、素材を入れ替えたりした上で、提出→審査通過後にリリースされるので、だいたい2~5日ほど遅れる。だが、実質的には変わらないものと考えて良い(同梱されている素材は一般的に利用されているものであり、添付してあるドキュメントに従っていれば、他に利用しても構わない)。日本語のコメントが欲しい場合は「Google Drive版」を利用しても良いだろう。

>>プラグイン&サンプルをダウンロード
(Google Drive版。画面右上にあるダウンロードアイコンを押す)


(※) Unity 5.6.3p1, 2017.3.0f3 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認



■プラグインのセットアップ

1.まずは Asset Store からパッケージをダウンロードしてプロジェクトにインポートしよう。私の環境だけかも知れないが、なぜかローカルに既にダウンロードされているキャッシュのせいで最新版にならないことがあるので、そういう場合はエクスプローラなどでローカルのHDDのパス「C:\Users\(ユーザ名)\AppData\Roaming\Unity\Asset Store-5.x」(バージョンによってフォルダ名は異なるかも)フォルダ以下にある「Fantom\ScriptingGUI\Android Native Dialogs and Functions Plugin.unitypackage」を削除すれば、強制的に最新版をダウンロードできるようになる(通常は更新されるハズなのだが…)。

Android Native Dialogs and Functions Plugin



2.インポートが終わったら、フォルダの構成を少し変更する必要がある。「FantomPlugin」フォルダを開くと配下に「Plugins」フォルダがあるが、これをドラッグ&ドロップで「Assets」の直下に移動しよう。この「Plugins」フォルダは特殊なフォルダであり、プラグインの実体(fantomPlugin.aar)やマニフェストファイル(AndroidManifest.xml)などが入っている。「FantomPlugin」フォルダにあるドキュメント「fantomPlugin_ReadMe_jp.txt」("_en" は英語版)にも書いて置いたので、上手く動作しなかったときなどは確認して欲しい。

●インポート直後の状態


●「Plugins」フォルダを「Assets」直下に配置しなおした状態


※アセットストア版は規定上1つのフォルダにまとめなくてはいけないため移動する必要があるが、「Google Drive 版」の場合ははじめから「Assets」直下にあるので移動の必要はない。



■デモのビルド

 動作確認のためにもここでデモをビルドしてみよう。プラグインを利用したアプリをビルドするにはいくつかの注意点がある。それは「"AndroidManifest.xml"の使用」と「要求 API Level」「必要なパーミッション」「画面回転の設定」などである。一度理解してしまえば、他のものでもだいたい同じなので、1つ1つやってみよう。



●「AndroidManifest.xml」を用意する

 プラグインの全ての機能を利用するには Unity デフォルトで使われるアクティビティ「UnityPlayerActivity」をオーバーライドした「FullPluginOnUnityPlayerActivity」(※このプラグイン用のアクティビティ)を使う必要がある。デモのマニフェストファイル「AndroidManifest_demo.xml」にはあらかじめ全ての機能が利用できるように設定されているので、これを [Ctrl + D] などで複製して「AndroidManifest.xml」にリネームして欲しい。デモの場合は「必要なパーミッション」「画面回転の設定」は設定されているのでこれで完了である。
(※) 独自のマニフェストを使ってビルドする場合「Unable to find unity activity in manifest. You need to make sure orientation attribute is set to fullSensor manually.」という警告が出るが、「デフォルトのUnityアクティビティが見つからない」「画面回転を自分で設定してね」という内容なので無視して良い。





●「要求 API Level」の設定

1.ファイルメニューから「File>Build Settings...」を開こう。ダイアログが出たら、「Platform」から「Android」を選択し、「Switch Platform」ボタンを押してプラットフォームを Android に切り替えよう。ボタンがグレーアウトしたら切り替え完了なので、そのまま「Player Settings...」ボタンを押して「PlayerSettings」を開いて欲しい。



2.「PlayerSettings」では「Other Settings」を開いて「Identification」の「Minimum API Level」を最低「Android 4.2 (Jelly Bean' (API Level 17)」に設定する必要がある。実際にはプラグインの機能によって要求される API Level があるので、それに合わせて変更して欲しい。ここでは簡略のため一番低い API Level にしている。デバイスの OS が必要 API Level を満たしてないときは機能は無視されるので注意しよう。



3.ついでに「Other Settings>Identification」では「Package Name」も設定しておこう。これはアプリの ID となるものなので、ユニークなものにする。名前の付け方などは公式のデベロッパーマニュアルを参照して欲しい(※「com.Company.ProductName」のままだとエラーが出てビルドできない)。

アプリケーション ID の設定



●シーンを追加してビルドする

 ここまでできたら、「Build Settings」のダイアログに戻り、「Scenes In Build」にビルドするシーンを追加しよう。ここではとりあえず「Assets/FantomPlugin/Demo/Scenes」(Google Drive版は「Assets/_Test/Scenes/」)直下にあるシーンを全てドラッグ&ドロップで追加してしまおう。「Build」(または「Build And Run」)ボタンでビルドして実機で色々な機能を試してみよう(権限許可がいくつか出るが、全て許可して下さい)。







■Android ビルドをもう少し詳しく

 ついでに、ここではもう少しつっこんだ Android ビルドの内容も解説しておこう。Android のアプリ(拡張子:.apk)にはマニフェストファイル(AndroidManifest.xml)と、そこに記述された起動アクティビティUnityPlayerActivity)が必要である(※あくまで Unity の場合。サービスのみのアプリなどは別の方法を用いる)。これらは通常のビルドの場合、Unity がデフォルトで用意してくれるので、自分で用意する必要はない。実際のファイルは Unity をインストールしたパスにあるのでエクスプローラなどで覗いてみるのも良いだろう。

(AndroidManifest.xml)
C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Apk
(UnityPlayerActivity)
C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player に「UnityPlayerActivity.java
(※パスはユーザーによる)

 プラグインはこれらを拡張したものとなる(※他の方法もあるが、ここでは割愛。必要なら公式マニュアルを参照)。前述した「AndroidManifest.xml」の解説に加えて、いくつかの設定方法も書いておこう。

(デベロッパーマニュアル)
App Manifest Overview
AndroidManifest.xml

(※) 独自のマニフェストを使ってビルドする場合「Unable to find unity activity in manifest. You need to make sure orientation attribute is set to fullSensor manually.」という警告が出るが、「デフォルトのUnityアクティビティが見つからない」「画面回転を自分で設定してね」という内容なので無視して良い。



●パーミッションの設定

 機能によってはパーミッション(権限)が必要になるものがある。デモをビルドして起動したとき、初回に出る「録音を許可」「ストレージアクセスの許可」「バイタルサインの取得許可」のように出てくるあれだ(ダイアログが出ない権限もある)。Unity をデフォルトで使っている分には自動的に付加してくれるが、プラグインなどでオーバーライドする場合は自分で設定して置かなければならないことも多いので、覚えておくと良いだろう。なお、権限が許可されてない機能を使おうとした場合、エラーが出たり無視されたりするので、基本的には使えるかどうかをはじめに1度で良いので確認した方が良い(※このプラグインの場合、だいたい「IsSupported~」というメソッドやプロパティが用意してある。「~Controller」を使う際は、起動時に自動的にチェックされる)。

 権限の設定に関しては「AndroidManifest.xml」に以下のように書く。例えば「録音許可」のパーミッションの場合、以下のようになる。

<uses-permission android:name="android.permission.RECORD_AUDIO" />

 これら権限は通常「<manifest>~</manifest>」タグの間に書く。普通はデモのときに利用した「AndroidManifest_demo.xml」のように先頭に書いた方が良いだろう。また、Google Play などでアプリをダウンロードする際にも要求される権限として表示されるので、必要のない権限は書かない方が良い。あまりに要求権限が多いとインストールを拒否られる確率も高くなるので最低限にすることを心がけよう。

 なお、このプラグインで各機能に対して必要な権限はインポートした「Plugins/Android/」フォルダに「Permission_ReadMe.txt」にまとめてある。「AndroidManifest_demo.xml」には全ての権限は入っているので、そこから必要なものだけコピペするのも良いだろう。

(デベロッパーマニュアル)
パーミッション



●センサー利用時のフィルタリング(Google Play)

 センサー利用においては権限要求とは別に、そのデバイスがそのセンサーを搭載しているか否かという問題もある。このプラグインの場合、搭載されてないセンサーは単純に無視されるが(これも「IsSupported~」メソッドでチェックし、「~Controller」で利用できない場合無視している)、Google Play においてはフィルタリングをして、そもそも使えない端末ではダウンロードさせないようにしておくと親切だろう。

 例えば「心拍センサー」を搭載してない機種をフィルタリングしたい場合、以下のように書く。

<uses-feature android:name="android.hardware.sensor.heart_rate" android:required="true" />

 これもパーミッション同様「<manifest>~</manifest>」タグの間に書く。センサーの文字列に関しては、デベロッパーマニュアルで各センサーの名前定義(Constant Value)を使えば良い。

(デベロッパーマニュアル)
Using Google Play filters to target specific sensor configurations
各センサーの名前定義(※Constant Value の文字列を使う)



●画面回転の設定

 画面回転(デバイスの縦置き、横置き)に関しては「AndroidManifest.xml」と Unity の PlayerSettings の両方を合わせておく必要がある。合ってない場合、意図した画面にならないことがあるので注意しよう。

 「AndroidManifest.xml」側での設定の場合、<activity>」タグの「android:screenOrientation」属性がその設定となる。デベロッパーマニュアルには非常に多くの値があるが、Unity で利用する場合はおおむね「縦置き」(=portrait)か「横置き」(=landscape)であり、デバイスの上下、左右の向きによって回転するか否かの「sensor」を組み合わせると考えて良いだろう。例えば横置きでデバイス方向が決まっている場合「landscape」で、横置きでデバイスの方向により回転させる場合「sensorLandscape」のようになる。VRでは横置き固定、2D横スクロールゲームでは横置きで回転可といった具合だ。縦横どちらでも回転できる場合は「sensor」だけで良い。以下に「横置きでデバイスの向きにより回転」の例を挙げておこう。

<activity(…略…)
android:screenOrientation="sensorLandscape"
(…略…)/>
</activity>

 インポートした「Plugins/Android/」フォルダには「AndroidManifest-FullPlugin_Landscape.xml」「AndroidManifest-FullPlugin_Portrait.xml」「AndroidManifest-FullPlugin_Sensor.xml」が入っているが、これらはそれぞれ「sensorLandscape」「sensorPortrait」「sensor」が設定してある。

 Unity 側の設定の場合、メニューから「Edit>Project Settings>Player」で「PlayerSettiings」に画面回転の設定がある。「Resolution and Presentation」を開くと「Allow Orientations for Auto Rotation」があるので、ここで利用できる縦置き、横置きと回転方向を設定しよう。例えば上のマニフェストファイルの例と合わせて「横置きでデバイスの向きにより回転」の場合、以下のようになる。


 Android 端末の場合、iPhone と違って規定が少ないため、メーカーによってデザインやボタン配置が異なる。なので、ユーザーのためできる限り回転は対応しておいてあげたい(縦または横のどちらかにするのは構わないが)。ヘッドホンのプラグの位置や音量・電源ボタン、利き手が右利き・左利きでも持ちやすさは変わるからね。もちろんVRのようにあらかじめ方向が決まっているものはその限りではない。



 その他の注意点などはインポートした「FantomPlugin」フォルダの「fantomPlugin_ReadMe_jp.txt」("_en"は英語版)に書かれているので、必要があれば確認して欲しい。最近はアセットストアに出したため、海外の方からも質問メールを受けるようになった。ドキュメントにはアドレスも書いておいたので、直接質問してくれても構わない。ツイッターでも何度か質問受けてるね。たまに研究に没頭して何日か放置してることもあるが(笑)、気づいたら大抵返事はしてるので気長に待っていて欲しい。どちらでもご自由に。


●ツイッター連携の質問箱にも登録した

>>モナ箱タイムライン



(関連記事)
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】Unity Asset Store にアセットを提出(申請)する

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityプラグイン 
tb: 0   cm: --

【Unity】ARCore を使って現実世界にプロ生ちゃんを召喚してみる  


 やっと ARCore の正式版が 2/23 にリリースされたので、さっそくいじってみることにした。というのはベータ版段階では Galaxy S8 や Google Pixel 等の最新機種しか使えなかったんだよね。正式版(掲載時点:ver.1.0.0)の「Supported Devices」では Android 7.0(Nougat) and later となっている。Galaxy S7 Edge(2016/5/19発売)でも使えるみたいだ。

●SDプロ生ちゃんを ARCore で召喚してみた

 ドキュメントはうん、まぁ、英語だよね(笑)。数ヶ月したら日本語化されてたりするけど、はじめは大体こんなもんだ。GearVR作ってみたときもまだ英語だけだった(今は少し日本語化されている)。なのでとりあえず Google翻訳使いながら、機械的に作ってみた。

※バッテリー温度やコンディション等の取得プラグインはこちら(Android の色々な機能を使える Unity プラグイン)


(※) Unity 2017.3.0f3 / ARCore 1.0.0 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認



■開発環境の設定(Setting up your development environment)

※基本的にはここの翻訳である。

1.Android SDK のバージョン 7.0(API Level 24)以上をインストールするには以下のようにする。

Android Studio」をインストールする。

・Android Studio でメニューから「Tools>Android>SDK Manager」で「Android 7.0 (Nougat)」にチェックを入れてインストールする)。


●Android Stuidio の SDK Manager


2.Unity 2017.3.0f2 以上をインストールする(「Personal」(無料)でも良い)。インストールの際には「Android Build Support」にチェックを入れてコンポーネントをインストールする。



※ドキュメントには書かれてないが初回の場合は、インストールした「Android SDK」のパス(Android Studio の SDK Manager を開けばパスがわかる)を Unityエディタのメニュー「Edit>Preferences...」の設定ダイアログの「External Tools」でパスを設定する必要があるかも知れない)。



3.以下のいずれかの方法で「ARCore SDK for Unity」もダウンロードする。

・Unity パッケージ「SDK for Unity」(.unitypackage)をダウンロードする。

・リポジトリから(Gitなどで)Clone する。
git clone https://github.com/google-ar/arcore-unity-sdk.git

4.サポートされているデバイスが必要である。



■デバイスを用意する(Prepare your device)

※基本的にはここの翻訳である。

サポートされているデバイスを用意し、開発者向けオプション」を有効化し、「USBデバッグ」をオンにする


※「開発者向けオプション」を有効化する方法はここを参照



■新規プロジェクトを作成する(Create a new project)

※基本的にはここの翻訳である。

・Unity で「HelloAR」という名前でプロジェクトを作成し(※名前は任意で良い)、「3D」にする。そして「Create Project」ボタンを押す。

※Unity 2017.3.0f2 以上



■SDK をインポートする(Import the SDK)

※基本的にはここの翻訳である。

1.Unity のメニューから「Assets>Import package>Custom Package」でダウンロードした「arcore-unity-sdk-vX.X.X.unitypackage」(X.X.Xはバージョン番号が入る)を全てインポートする(プロジェクトエクスプローラでドラッグ&ドロップでも良い)。



2.Unity のプロジェクトエクスプローラでは SDK のファイルと「Assets/GoogleARCore/Examples/HelloAR」にサンプルシーンが見られる。







■ビルド設定を構成する(Configure the build settings)

※基本的にはここの翻訳である。

・Unity でメニューから「File>Build Settings...」を開く。

・次に以下のように設定する。

1.「Platform」のターゲットを「Android」にし、「Switch Platform」ボタンを押す。



2.「Player Settings」ボタンを押し、開いた「PlayerSettings」を以下のように設定する。

 ・「Other Settings>Rendering>Multithreaded Rendering」をオフにする。
 ・「Other Settings>Identification>Package Name」にアプリ固有のIDとなる Java のパッケージ名を入れる。例えば:"com.example.helloAR" など(※パッケージ名は任意で良い)。
 ・「Other Settings>Identification>Minimum API Level」で「Android 7.0 'Nougat'(API level 24)」以上に設定する。
 ・「Other Settings>Identification>Target API Level」で「Android 7.0 'Nougat'(API level 24)」または「Android 7.1 'Nougat'(API level 25)」に設定する。
 ・「XR Settings>XR Settings>ARCore Supported」をオンにする。





3.「Scenes In Build」にビルドするシーンを追加する。「HelloAR」の場合は、以下のようにして追加する。

 ・プロジェクトエクスプローラで「Assets/GoogleARCore/Examples/HelloAR」を探す。
 ・シーン「HelloAR」をクリックし、「Scenes In Build」にドラッグ&ドロップする(※既にシーンを開いている場合は、「Add open scenes」ボタンでも追加できる)。



■サンプルアプリケーションをビルドして実行する(Build and run the sample app)

※基本的にはここの翻訳である。

デバイスとPCがUSBで接続されていることを確認したら、「Build And Run」ボタンを押す。すると Unityはプロジェクトを Android APK にビルドし、それを自動的にデバイスにインストールして起動する。


●2回目以降は、メニューから「File>Build & Run」(Crtl+B) でダイアログを開かなくてもビルド→アプリ起動できる


※初回起動時にはデバイス(スマホ)側で ARCore のインストール、またはアップデートを促されることがある。



(※以下、ドキュメントをまるっと google翻訳→コピペ)

・あなたのデバイスを移動すると、アプリは自動的に平面を検出し、ダイヤモンドグリッドを描画します。 グリッドをタップすると、Androidロボットが地面に置かれます

Android Logcatを使用してログメッセージを表示するか、Android Device Monitor を使用してデバイスをより包括的に分析することができます。



■次のステップ(Next Steps)

※基本的にはここの翻訳である。

※ARCore を自分のアプリに組み込むには、以下を参照(ARCore の対応機種やインスト状態、アップデートの必要性などの事が書かれている)。

Enable ARCore
ARCore for Unity API Reference



■キャラを入れ替える(オマケ)

 これはただのオマケだが、ヒエラルキーの「Exsample Controller」を選択肢、インスペクタで「Andy Android Prefab」(海外ではドロイド君ではなくて、アンディ君と言うのか(?))のプレファブを入れ替えれば、AR でクリックしたとき出て来るキャラを他のキャラにすることもできる。サイズは原寸(SDプロ生ちゃんは約1m)みたいなので、特にスケールはいじる必要は無いようだ(元がオリジナルサイズの場合)。色々試してみよう。


●他のキャラのプレファブに置き換えるだけでOK



※プロ生ちゃんのインポート・動かす方法はこちら


● Andy君(?)をプロ生ちゃんに入れ替えて、現実世界に召喚してみた
 

●クエリちゃんを現実世界で飛ばしてみたよ!

●ARでけもみみ天国?!

●飛行ARユニティちゃんver ●ARでドラゴンとバトル!

●ARで野外ライブ!?


(関連記事)
【Unity】GearVR アプリをビルドする
【Unity】SDプロ生ちゃんを動かす!
【Unity】【C#】クエリちゃんを飛行させる!
【Unity】【C#】ユニティちゃんを飛行させる!







"Query-Chan model" は Creative Commons Attribution 4.0 International License(CC-BY) に基づいて配布されています。

このコンテンツの一部には『ユニティちゃんライセンス』で許諾されたアセットが使用されています。
Portions of this work are licensed under Unity-Chan License


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: AR  プロ生ちゃん 
tb: 0   cm: --

【Unity】Unity Asset Store にアセットを提出(申請)する  


 元々は「UnityChan Flyer」や「SapphiartChan Live Show!」みたいな Cardboard VR でも、Gear VR のように手元で音量操作したくてプラグインを作り始めたのだが、なぜか大幅に脱線して(いつものことだが(笑))、Android のネイティブの機能を色々使うプラグインに発展してしまった…。作った機能は30個を超えているので、ちょっと試しにアセットストアに提出してみたので備忘録。

 やってみた感想は、難しくはないのだが、少しわかりずらいと思った。と言うのはあまり(というか全然)ヘルプみたいのが発達してないんだよね。まぁ、ほとんど英語というのは仕方ないかも知れないが(しかし、OculusStoreAmazonStore などは少しずつだが日本語化も進んでいる)、Unity の場合、Web 上の管理ページAssetStoreTool の2つを使わないとできないので説明がないとやり方に戸惑う。一度やってしまえば簡単だが、結局のところググって日本語で書かれている記事などを参考にしながらやった。

 同じように戸惑う人はいると思うので、一連のやり方をまとめて置くことにした。と言っても、やはりバージョン違いなどでやり方や画面は変わってしまうと思うので(私が参考にした記事も既に色々変わっていた)、その時々で最新の情報は必要かも知れない。なので、とりあえず大まかな流れを掴んで貰えれば応用は利くと思う。


●プレビュー画面はこんな感じ(なぜか旧画面(笑))


(※) Unity 5.6.3p1 / Asset Store Tools 4.1.0 / Windows10(x64) で確認



■新規にアセットを提出する

1.まずはパブリッシャー(デベロッパー)登録をする(無料)。個人でやってるなら、普段使っている Unityログインアカウントと同じにしても良いと思う。初回なら「info」でパブリッシャー情報入力になると思うが、必須項目を入力すれば良いだけだ。なお、メールアドレスは審査の結果などが送られてくるので、きちんと間違いないように気を付けた方が良いだろう。



2.登録完了したら、タブの「Packages」を押し、新規のアセット提出の場合は「Create New Package」を押す。ここで覚えておいて欲しいのは、この管理画面で作った「Draft」(草稿)と、Unity の AssetStoreTool は連携しているということだ(ログインアカウントでリンクする)。つまり、アップデートなどをするときも必ず「Create New Draft」を押して、新しい草稿ページを作り、情報入力しなければならない(Draft がないとアップロードできない。内容は引き継ぐことができる)。一覧に表示されたら、各アセットのタイトルをクリックすることにより情報入力画面に移動することができる(初回は自動で移動する)。各情報の「Save」を押すことを忘れないようにしよう。





3.草稿(Draft)に情報入力し終わったら、今度は Unity エディタに戻り、提出するアセットのプロジェクトを開いた上で、AssetStoreTool をインポートしよう。なお、使用しているエディタのバージョンによってストアでは「対応するUnityバージョン」と表示されるので、もし最新の Unity でしか使えないというものでないなら、なるべく古いバージョンで提出した方が良いそうだ(あくまでも互換性のあるバージョンという意味で。Unity4 とかはさすがにやめた方が良いと思う(笑))。



4.インポートし終わったら、メニューの「Asset Store Tools>Package Upload」を選べば、初回の場合はログインダイアログが出るので、パブリッシャー(デベロッパー)登録で作ったアカウントにログインする。



5.ログインに成功したら「Select a package」のダイアログが出ると思う。この中に先ほど管理画面で作った「Draft」が表示されているハズなので選択する。



6.初回の場合は「Select assets folder」ボタンで提出するアセットのルートフォルダを指定する。現在では全てのアセットを最終的に1つのフォルダ(よく使われるのはメーカー名とかアセット名とか)にまとめて提出しなければいけないらしい。私が提出したプラグインの場合「Plugins」フォルダを自分のアセットとは別に「Assets/Plugins/」のように配置する必要があるが、その場合も提出フォルダに移動しておき、使用する際にマニュアルを設けて、ユーザーにフォルダの移動を指示しなければならないとガイドラインにある(非常にたくさんのことが書かれているのでここでは取り上げないが、「デモシーンを作ってね」とか「コメントは英語で書いてね」とか色々要求がある。Google翻訳で一度は読んでおこう(笑))。



7.またもう1つ「Select main assets」というものがあるが、これは提出するアセットを端的に表したメインとなるアセットを選ぶらしい。それは例えば3Dモデルなら、そのモデルのプレファブなどと言った具合だ(アセットの種類にもよるがプレビューにも使われるらしい(?)→以前のアセットストアにはあったが、今のアセットストアには無いね(笑))。



8.あとは「Upload package」を押せば、アセットがアップロードされる。しばらく進捗が表示されると思うが、完了したら管理ページを見てみよう。「Unity Package」の欄にアップロードしたアセット(パッケージ)が表示されているハズだ(開いたままだったら「Refresh」ボタンを押すと出てくる)。



9.アップロードが完了し、管理画面で「Metadata & Artwork」(アセットの説明やローカライズ、イメージ画像・動画など)も全て完了したら(「Preview in AssetStore」ボタンでストアのプレビューが確認できる)、画面右下の方にある「I own the rights to sell these assets」(自分はこれらアセットを販売する権利を所有している)にチェックを入れると「Submit package for approval」ボタンが押せるようになるので、これを押したら申請完了だ。





 あとは審査待ちをするだけだ。一覧に戻ると提出したものは「Pending Review」に入っている(草稿の場合は「Draft」に切り替えれば見える)。なお、一度提出したものは修正できないので、その場合は各アセットの「Packages」に入り(タイトルのリンクを押す)、右の方にある「Create New Draft」で新しい草稿を作り、再度提出することになる(アップデートと同じ)。



 私の場合リジェクト(修正依頼→再提出)が無かったので、審査(修正)の詳細はわからないが、その旨は登録メールに来るらしい(?)。ネットでの情報によると審査期間はだいたい3週間くらいだそうだ(私の場合、たまたま年末年始を挟んでしまったので1ヶ月かかった)。審査が通過するとその旨がメールで送られてくる。私の場合、送られてきた時点で既にリリースされていた。



■アップデート版を提出する

1.基本的には新規アセットのときとあまり変わらない。既にリリースされているものは「Published」に入っているので、そこから各タイトルをクリックし、情報入力ページにある「Create New Draft」を押せば良いだけだ。





2.アップデート版に特に必要な部分は「Version」(バージョン番号:ユーザー向け)と「Version changes」(更新情報・履歴など)を書くということらしい。これらが適切に入力されてないとリジェクトされるという話を聞いた(ググってるときに誰かが言ってた)。



3.あとは新規アセットのときと同じように、AssetStoreTool を使い、アップデート版を「Draft」にアップロードする。



4.アップロードしたら、管理画面へ行き(エディタのメニューの「Asset Store Tools>Publisher Administration」でも飛べる)、画像や動画、説明などを更新・確認したら、画面右下の方にある「I own the rights to sell these assets」をチェックして、「Submit package for approval」ボタンを押せば申請完了だ。



 時期にもよるとも思うが、アップデートの場合は1~3日くらいで審査が終わるようだ。私の場合2日だった。これも審査通過のメールが来てた時点でアップデート版がリリースされていた。


(関連記事)
【Unity】GearVR アプリを Oculus Store に申請する(要件・仕様の概要)
【Unity】Amazonアプリストアに申請する


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: ストア申請 
tb: 0   cm: --

【Unity】カスタムダイアログを簡単に生成するプレファブを作ってみた(CustomDialogController)  


 どちらかと言うとこのプラグインはプログラマ向けという感じだったが、Unity は GUIツールでもあるので、プログラムに詳しくない人でも扱えるように、今回のアップデートではなるべくコードを書かずに、ダイアログなどを簡単に生成できるプレファブを作ってみた。しかし、大抵のものは楽に使えると思うが、カスタムダイアログだけは与えるパラメータが最も多く、扱いが難しく感じるので、ここでは各アイテムの設定などを含めて解説しておくことにした。方法だけわかってしまえば、わりと簡単に扱えるようになると思う。

>>プラグイン&サンプルをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)


 プラグインのインポートからはじめる場合は以前の記事を参照して欲しい。実際にセットアップしてあるサンプルシーンは「Assets/_Test/Scenes/DialogExTest」となる。プレファブをコピペして使うのも良いだろう。


(※) Unity 5.6.3p1, 2017.3.0f3 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認



■カスタムダイアログの概要と使い方

 簡単に言うと、カスタムダイアログとは「分割線」「テキスト」「スイッチ」「スライダー」「トグルボタン(グループ)」を自由に追加できるダイアログである。「分割線」「テキスト」は戻り値を持たないが、「スイッチ」「スライダー」「トグルボタン(グループ)」はキーを設定することによって、そのキーに関連づけられた値を辞書形式(Dictionary<string, string>: key, value)で受け取ることができる(※キーの重複はできない)。ただし、値は全て文字列型になので、適宜キーで判別するなどして変換して使うことになる。プラグイン内にはスイッチ(SwitchDialog)スライダー(SliderDialog)を並べたダイアログなどもあるが、それらの各アイテムを自分でカスタマイズできるダイアログと考えれば良い。

 使い方は「AndroidPlugin.ShowCustomDialog()」に各アイテムのパラメータ(DialogItem)の配列を渡せば良いが、ここではそれらを少し簡単にまとめた「CustomDialogController」のプレファブを中心に扱うことをやってみよう。プレファブは「Assets/FantomLib/Prefabs/Dialogs/CustomDialogController.prefab」にある。これをヒエラルキーに置き、そのオブジェクトの子要素として(「Find Items In Child」がオンのとき)、各アイテムのプレファブ「DialogItemDivisor」「DialogItemText」「DialogItemSwitch」「DialogItemSlider」「DialogItemToggles」(「DialogItems」フォルダにまとめてある)を配置することで生成することができる(上から順にダイアログ内に配置される)。なお、孫要素までは探さない。また「Find Items In Child」がオフのときは自分で「Items」の「Size」を設定し、そこに各アイテムのプレファブなどを登録すれば良い。




 結果の受け取り方は、インスペクタのコールバックにメソッドを登録することにより受信できる。コールバックには2種類あって「On Result」はダイアログで「OK」ボタンを押したときの最終的な結果を辞書(Dictionary<strring, string>)でキーと値のペア(文字列型)で受け取ることができる。もう1つのコールバック「On Value Changed」はダイアログ表示中に「スイッチ」「スライダー」「トグルボタン(グループ)」が押されたときにリアルタイムで値を受け取ることができるものだ(こちらはキーと値がそれぞれ文字列型で返される)。プレビューなどに使うと良い。


(※) インスペクタでのコールバックの登録方法がわからない場合は以下の記事を参考にして欲しい。
【Unity】【C#】UnityEvent, Action, delegate, interface でのコールバック実装方法とインスペクタでの登録

 また「Save Value」はそれら結果を PlayerPrefs に自動保存しておく機能だ。「Save Key」で保存名(PlayerPrefs のキー)を指定することもできる。空の場合、その GameObject 名+"_values" のような名前で保存される(PlayerPrefsキー名はプロパティの「SaveKey」で取得できる)。またプロパティの「CurrentValue」でいつでも値を取得・変更することもできる(Dictionary<string, string> 形式)。ただし、保存タイミングは「OK」ボタンで決定したときなので注意しよう(OnValueChanged では保存されない。保存したいときは手動で CurrentValue で値をセットし、SavePrefs() メソッドで保存する必要がある)。

 各アイテムの設定は「DialogItemParameter」というクラス(便宜上すべてのアイテムのパラメータをまとめたクラス。実行時には DialogItem の派生クラスに変換される)に代入することになるが、各アイテムによって必要なパラメータは異なるので、以下に順に解説しておこう。



■分割線の設定(DialogItemDivisor)


 「分割線」とはただの区切り線である。キーを持たず、特に機能はない。使用するにはまず「Item Type」を「Divisor」にする。あとは以下にパラメータの説明をまとめて置いたので、任意に設定して欲しい。

●引数
Line Height線の太さ。単位は Android の dp となる。
Line Color線の色。ただし、無色透明(#00000000)を与えると指定なし(デフォルト=灰色)となる。





■テキストの設定(DialogItemText)


 「テキスト」とはただの文字列表示である。キーを持たず、特に機能はない。使用するにはまず「Item Type」を「Text」にする。あとは以下にパラメータの説明をまとめて置いたので、任意に設定して欲しい。

●引数
Text表示するテキスト文字列。
Text Colorテキストの色。ただし、無色透明(#00000000)を与えると指定なし(デフォルト=薄い黒)となる。
Background Colorテキストの背景色。ただし、無色透明(#00000000)を与えると指定なし(デフォルト=なし[システムによる])となる。
Align文字揃え。「Left」で左寄せ、「Center」で中央寄せ、「Right」で右寄せ、「None」で指定なし(デフォルト=左寄せ[システムによる])。





■スイッチの設定(DialogItemSwitch)


 「スイッチ」とはオン・オフを切り替えることによって「true」または「false」の値(ただし文字列型)を返すウィジェットである。キーを持ち、その値はキーに紐付けられて返される。使用するにはまず「Item Type」を「Switch」にする。あとは以下にパラメータの説明をまとめて置いたので、任意に設定して欲しい。

●引数
Key値に紐付けするキー。コールバックで返される値(辞書:Dictionary<string, string>)では result["key"]="true" または result["key"]="false"(※値は文字列型なので注意)の形式で返される。キーは重複できない。
Text表示するテキスト文字列。
isOnスイッチの初期値。オン = true, オフ = false
Text Colorテキストの色。ただし、無色透明(#00000000)を与えると指定なし(デフォルト=薄い黒)となる。





■スライダーの設定(DialogItemSlider)


 「スライダー」(Android ではシークバーと呼ばれる)とはスライダーを動かすことによって値を変化させるウィジェットである(ただし文字列型)。キーを持ち、その値はキーに紐付けられて返される。使用するにはまず「Item Type」を「Slider」にする。あとは以下にパラメータの説明をまとめて置いたので、任意に設定して欲しい。

●引数
Key値に紐付けするキー。コールバックで返される値(辞書:Dictionary<string, string>)では result["key"]="value"(※値は文字列型なので注意)の形式で返される。キーは重複できない。
Text表示するテキスト文字列。
Value初期値(整数部分6桁+小数点以下3桁まで)。
Min Value取り得る最小値(整数部分6桁+小数点以下3桁まで)。
Max Value取り得る最大値(整数部分6桁+小数点以下3桁まで)。
Digit小数点以下桁数(0:整数, 1~3:小数点以下桁数)。
Text Colorテキストの色。ただし、無色透明(#00000000)を与えると指定なし(デフォルト=薄い黒)となる。






■トグルボタン(グループ)の設定(DialogItemToggles)


 「トグルボタン(グループ)」(Android ではラジオボタンと呼ばれる)とはグループ内のアイテムを唯一選択するウィジェットである。キーを持ち、その値はキーに紐付けられて返される。その選択肢は「Toggle Items」にまとめられ、それぞれのアイテムの値(Value)が設定されたキーに紐付けられる(key=value1 または key=value2, … のように)。使用するにはまず「Item Type」を「Toggle」にする。あとは以下にパラメータの説明をまとめて置いたので、任意に設定して欲しい。

●引数
Key値に紐付けするキー。コールバックで返される値(辞書:Dictionary<string, string>)では result["key"]="value" の形式で返される。キーは重複できない。
Toggle Items[]選択肢の文字列と値の配列。「Text」は表示文字列で、「Value」が選択された場合の戻り値となる。
Selected Index初期値(選択)のインデクス(0~)。
Text Colorテキストの色。ただし、無色透明(#00000000)を与えると指定なし(デフォルト=薄い黒)となる。




 これらは以前に書いたコードでの機能と同じものなので(というより、コードをなるべく書かないで済むようにプレファブを作っただけのもの)、コードで書きたい場合は以前の記事を参考にして欲しい。



■更新履歴

 今回のアップデートを簡単に説明しておくと以下のようになる。[⇒全体の更新履歴はこちら]

・おおよそ全ての機能のプレファブ&「~Controller」スクリプトを追加。
単一選択(SingleChoiceDialog)複数選択(MultiChoiceDialog)スイッチダイアログ(SwitchDialog)カスタムダイアログのアイテムに値変化のコールバックを追加。
・XDebug の自動改行フラグ(newline)が無視されていた不具合を修正。また、行数制限を使用しているときに、OnDestory() でテキストのバッファ(Queue)をクリアするようにした。

※以前のバージョン上書きでも問題なく動作すると思います。


(関連記事)
【Unity】Androidでカスタマイズしたダイアログを動的生成できるプラグインを作ってみた
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】【C#】UnityEvent, Action, delegate, interface でのコールバック実装方法とインスペクタでの登録


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityプラグイン 
tb: 0   cm: --


プロフィール

Twitter

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop