FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Unity »【Unity】Androidで日付・時刻選択ダイアログ(DatePicker, TimePicker)を使う

【Unity】Androidで日付・時刻選択ダイアログ(DatePicker, TimePicker)を使う  


 今回は Unity で Android 標準の Picker 系ダイアログ 利用できるプラグインを作ってみた。この手の UI は自分で作るとなるとかなり面倒なので、はじめから用意されているのなら非常に助かる。Unity は元々ゲームエンジンだが、もはや今では多方面に利用されているので、スケジューラ的な機能をアプリに付けたいときなどには使えるかもしれない。

 今回も
Androidの基本機能を利用するプラグインのアップデート版となる。追加内容・仕様変更などはなるべく更新履歴に書くようにしているが、基本的にはそのまま使えるようにしているので、旧バージョンがある場合は上書きでも構わないと思う。プラグイン自体のセットアップは以前の記事を参照して欲しい。自分で作りたい場合は簡略化したものだが、今回も元の Java コードを書いておくので挑戦してみるのも良いだろう(※Java コードは解説用に一部抜粋・省略したものであって、そのままコピペでは使えないことに注意)。


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



 パッケージに同梱されているサンプルでは、シーン「Assets/_Test/Scenes/DialogTest」にまとまっているので、適当に複製などして自由に使って欲しい。


(※) Unity 5.6.3p1 / AndroidStudio 2.3.3 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認



■日付選択ダイアログを使う(DataPickerDialog)


●Unity から Android の日付選択ダイアログを使う C# コード
using FantomLib;

#if UNITY_ANDROID && !UNITY_EDITOR
AndroidPlugin.ShowDatePickerDialog(defaultDate, resultDateFormat, callbackGameObject, callbackMethod, style);
#endif

●プラグイン内の対応する Java コード
import android.app.DatePickerDialog;
import android.content.Context;
import android.text.format.DateFormat;
import android.widget.DatePicker;
import java.util.Calendar;
import static com.unity3d.player.UnityPlayer.UnitySendMessage;

DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
Calendar cal = Calendar.getInstance();
cal.set(year, month, dayOfMonth);
UnitySendMessage(callbackGameObject, callbackMethod, DateFormat.format(resultDateFormat, cal).toString());
}
};

new DatePickerDialog(context, styleId, listener, year, month, day).show(); //※year, month, day は defaultDate を分割したもの

 これはUI上の日付を選択することにより、日付の文字列を入力するためのダイアログ(DatePickerDialog)である。選択された日付は引数の「resultDateFormat」の書式に従って「OK」ボタンで戻り値として入力されたテキストがヒエラルキーにある GameObject 名(callbackGameObject)のメソッド(callbackMethod)に文字列で返ってくる。またキャンセルボタンを押した時や、Android のダイアログの場合、範囲外をクリックするとダイアログが消えるが、その場合は何も返って来ない

 このプラグインの中身は Java で書かれているので、戻り値となる日付のフォーマットも Androidで利用されている Java の書式 になってしまうのだが、少し紛らわしいので C# の書式と共通の「年:yyyy(4桁) または yy(2桁)」「月:MM(2桁) または M(1桁)」「日:dd(2桁) または d(1桁)」を使うのが良いだろう([例] "yyyy/MM/dd"→"2017/01/03", "yy-M-d"→"17-1-3", "y年M月d日"→"17年1月3日" 等)。

 なお、初期値となる日付の書式は "yyyy/MM/dd" または "yy/M/d" に固定されている。空文字("")または認識できなかった場合は現在の日付が初期値に設定される。

(日付書式)[Java]
SimpleDateFormat
日付をフォーマットする

 ダイアログにはスタイル(テーマ)を当てられるようにしてある。省略=空文字("")のときはアクティビティのテーマと同じものになる。スタイルの引数は "android:Theme.DeviceDefault.Dialog.Alert" のように、名前のアンダバー("_")をドット(".")に変えたものを指定する。端末の API Level によって使えるものとそうでないものがあるので、アプリのビルドの API Level に合わせて指定する必要があるので注意。

(参考)R.style.theme

 サンプルコードは「Assets/_Test/Scripts/PluginTest.cs」の「TestDatePicker()」あたりを見て欲しい。



■時刻選択ダイアログを使う(TimePickerDialog)


●Unity から Android の時刻選択ダイアログを使う C# コード
using FantomLib;

#if UNITY_ANDROID && !UNITY_EDITOR
AndroidPlugin.ShowTimePickerDialog(defaultTime, resultTimeFormat, callbackGameObject, callbackMethod, style);
#endif

●プラグイン内の対応する Java コード
import android.app.TimePickerDialog;
import android.content.Context;
import android.text.format.DateFormat;
import android.widget.TimePicker;
import java.util.Calendar;
import static com.unity3d.player.UnityPlayer.UnitySendMessage;

TimePickerDialog.OnTimeSetListener listener = new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, hourOfDay);
cal.set(Calendar.MINUTE, minute);
UnitySendMessage(callbackGameObject, callbackMethod, DateFormat.format(resultTimeFormat, cal).toString());
}
};

new TimePickerDialog(context, styleId, listener, hour, min, true).show(); //※hour, min は defaultTime を分割したもの

 これはUI上の時刻を選択することにより、時刻の文字列を入力するためのダイアログ(TimePickerDialog)である。選択された時刻は引数の「resultTimeFormat」の書式に従って「OK」ボタンで戻り値として入力されたテキストがヒエラルキーにある GameObject 名(callbackGameObject)のメソッド(callbackMethod)に文字列で返ってくる。またキャンセルボタンを押した時や、Android のダイアログの場合、範囲外をクリックするとダイアログが消えるが、その場合は何も返って来ない

 このプラグインの中身は Java で書かれているので、戻り値となる時刻のフォーマットも Androidで利用されている Java の書式 になってしまうのだが、少し紛らわしいので C# の書式と共通の「時:HH(2桁) または H(1桁)」「分:mm(2桁) または m(1桁)」を使うのが良いだろう([例] "HH:mm"→"03:05", "H:mm"→"3:05", "H時m分"→"3時5分" 等)。

 なお、初期値となる時刻の書式は "HH:mm" または "H:m" に固定されている。空文字("")または認識できなかった場合は現在の時刻が初期値に設定される。

(時刻書式)[Java]
SimpleDateFormat
日付をフォーマットする

 ダイアログにはスタイル(テーマ)を当てられるようにしてある。省略=空文字("")のときはアクティビティのテーマと同じものになる。スタイルの引数は "android:Theme.DeviceDefault.Dialog.Alert" のように、名前のアンダバー("_")をドット(".")に変えたものを指定する。端末の API Level によって使えるものとそうでないものがあるので、アプリのビルドの API Level に合わせて指定する必要があるので注意。

(参考)R.style.theme

 サンプルコードは「Assets/_Test/Scripts/PluginTest.cs」の「TestTimePicker()」あたりを見て欲しい。



■更新履歴

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

日付選択ダイアログを追加。
時刻選択ダイアログを追加。
チェックボックス付きの Yes/No ダイアログを追加。
チェックボックス付きの OK ダイアログを追加。
・色形式 int 型の ARGB 形式(Android, Java 等)と Unity の Color 形式の相互変換クラス「XColor」をライブラリとして追加。

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



 実際の Java コードは色々値をチェックしたり条件分岐したり、高速化のためにキャッシュしたり、StringBuilderを使ったりしているが、長くなるのでここでは簡略化したものを書いてあると考えて欲しい。Java を知っている人なら中身は非常に簡単なものばかりなので、AndroidStudio を使ったことあるなら AAR プラグインをビルドするのに挑戦してみるのも良いだろう。


※この記事のUnityアセットはプラグインとして配布されています。



(関連記事)
【Unity】Androidでカスタマイズしたダイアログを動的生成できるプラグインを作ってみた
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】Androidでチェックボックス付きのアラートダイアログ(AlertDialog)を使う
【Unity】Androidで数値・半角英数・パスワード入力ダイアログを使う
【Unity】Androidでテキスト入力ダイアログを使う
【Unity】Androidのテキスト読み上げ(TextToSpeech)を使う
【Unity】Androidのハードウェア音量操作・ハードウェアキーの無効化をする
【Unity】Androidの選択ダイアログを使う
【Android】【Java】AlertDialog を使ってみる


スポンサーサイト

category: Unity

thread: ゲーム開発

janre: コンピュータ

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



トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/278-5e5096a5
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop