このエントリーは、KLab Advent Calendar 2015 の12/2の記事です。
KLabとしては久々のAdvent Calendar参戦です。2番手も緊張しますね。KLabGamesの基盤エンジニアのkenseiです。よろしくお願いします。
ソーシャルゲームは体力の概念があるゲームが結構あります。
ユーザが体力を全快した時間を知る方法があれば、よりスムーズにゲームを行う事ができます。
体力全快をユーザが知る手段の一つ、「体力全快予定時間にローカルプッシュを用いてユーザに全快を通知する方法」をご紹介したいと思います。
Appleのドキュメントによれば、「ローカル通知は、アプリケーション自身がスケジューリングし、送信する」とあります。
指定した時間になると、アプリがフォアグラウンドで動作していない場合は、アラートでの通知 / バッジアイコン、サウンドの形でユーザに伝えます。
アプリがフォアグラウンドで動作している場合は、アラートでの通知を行います。
AndroidはAlarmManagerとNotificationBuilderの組み合わせでローカルプッシュを実装できます。
体力全快通知を送る際に一番重要なのは「キャンセル処理」です。
スマートホンはマルチタスクなので、途中でゲームをサスペンドして別の作業を行った後にゲームを再開するかもしれません。
この時にローカルプッシュをタイマー送信していたらどうなるでしょうか?
ユーザがゲームを再開した時に、キャンセル処理をしない場合、ゲーム中に通知が飛んでしまいます。
また、ユーザが体力を消費したりアイテムなどで全快した場合も、キャンセル処理がないと
体力が全快でなかったり、すでに全快なのに、場違いな回復通知が飛んでしまう事態になってしまいます。
ではキャンセル処理はどのタイミングで送ればいいでしょうか?
KlabGamesのあるタイトルでは
の3箇所でキャンセル処理を行っています。
体力全快通知を送る際に一番重要なのは「設定されているタイマーを一つにして、常に最新にしておく事」です。
あれ、一番重要な事が増えた。。
iOSとAndroidで動くサンプルを作ってみました。
https://github.com/kensei/klab_advent_calendar_2015
体力を消費&回復し続けるだけのゲーム?です。
急ごしらえなので、バグってたら申し訳ありません。
クライアントプラグインを作成して、プラットフォーム別の処理をカプセル化しています。
unityでいうネイティブコードの初期化・ローカルプッシュの設定・ローカルプッシュのキャンセルをブリッジしています。
実はiOSはUnity標準でローカルプッシュの処理が用意されているのですが、
LocalNotification l = new LocalNotification(); l.applicationIconBadgeNumber = 1; l.fireDate = System.DateTime.Now.AddSeconds(10); l.alertBody = "test"; NotificationServices.ScheduleLocalNotification(l);
繰り返しを伴うローカルプッシュ
のような複雑な事はできません。
以上の理由から、今回は最初からネイティブコードを使用してローカルプッシュの実装を行っています。
また、iOS8ではローカルプッシュ通知にもユーザ許可が必要になりました。
ユーザ許可のためにUnityAppControllerを拡張しています。
code
AndroidはAndroidManifestに、ローカルプッシュで使用する権限の設定や、タイマーを受け取るレシーバの設定が必要になります。
起動時に各プラットフォームのネイティブコードを初期化しています。
明日は、僕が入社式に遅刻した時にメッチャ睨んできたpandax381さんのラズパイの話です。 お楽しみに。
KLabのゲーム開発・運用で培われた技術や挑戦とそのノウハウを発信します。
合わせて読みたい
KLabのゲーム開発・運用で培われた技術や挑戦とそのノウハウを発信します。