質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1378閲覧

Unity)Mainに行きたい

navesanta

総合スコア198

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2019/07/31 08:21

編集2019/07/31 08:27

LocalNotificationを使ったアプリ作成しています。
先日分からない点があり、こちらで質問したところ大変分かりやすい回答を
いただき解決しました。回答して頂いた方に感謝しています。

また分からない点が出てきたので教えて下さい。
できるだけ自分で解決しようと半日やりくり&調べましたが
解決できないのでお願いします。

Main(Scene)にLocalNotificationを設置してOnApplicationPauseが
発生した時、送信準備をして、時間がきたら送信します。

送信されたらデバイスでタップをするとIntentを取得して
別SceneBに飛びます。

質問はSceneBにMainに行くボタンを設置してタップしたのですが
瞬間的にMainが出てまたSceneBが表示されてしまいます。

MainにLocalNotificationのインスタンスがあるので
Loadする際に前のIntentDataを覚えていてそちらに
行ってしまうと推測できるのですがどうすればMain表示で停められるか?
・PlayerPrefでFlagを付けたらどうだとか、
・もう1つSceneを作成したらどうだとか
・IntentDataをGetして使った後にnullにしたらどうだとか
色々考えてみましたがいまひとつ方法が浮かびません。

環境)
PC: mac
Unity2018.3.14f1
言語:C#

分かる方お手数ですが教えて下さい。
できるだけ情報があった方が良いかと思い
今回のイメージを簡略化したものを作って見ました。
ローカルプッシュの流れ

下記がnotificationのコードです。

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; using UnityEngine.SceneManagement; #if UNITY_ANDROID using Unity.Notifications.Android; #endif public class LocalNotification : MonoBehaviour { #if UNITY_ANDROID int setTime; int nowTime; int seconds; int pushSecond = 10; // int pushSecond = 86400; int activeHour; int activeMin; int activeFlag; int activeSeconds; int cateId; int randomNum; string title; string message; string prefskeyHour; string prefskeyMin; string prefskeyActive; string m_channelId = "testhoge"; string intentLink; // Start is called before the first frame update void Start() { //通知用のチャンネルを作成する var c = new AndroidNotificationChannel{ Id = m_channelId, Name = "hoge", Importance = Importance.High, Description = "hogehoge", }; AndroidNotificationCenter.RegisterNotificationChannel(c); var notificationIntentData = AndroidNotificationCenter.GetLastNotificationIntent(); if(notificationIntentData == null) { return; //NullRefernceException throw }else{ //notification受信処理 string pushScene = notificationIntentData.Notification.IntentData; SceneManager.LoadScene(pushScene); } } //停止時にnotificationをセットする void OnApplicationPause(bool pauseStatus) { int bacDay = PlayerPrefs.GetInt("day", 40); DateTime now = DateTime.Now; int nowDay = now.Day; // if(bacDay != nowDay) // { if(pauseStatus == true) { randomNum = UnityEngine.Random.Range(0, 3); switch(randomNum) { case 0: message = ""; intentLink = "Main"; break; case 1: message = ""; intentLink = "Christian"; break; case 2: message = ""; intentLink = "School"; break; } uniNotification("name",message, pushSecond, intentLink); PlayerPrefs.SetInt("day", nowDay); PlayerPrefs.Save(); }else{ return; } // }else{ // return; // } } public void uniNotification(string title, string message, int seconds, string intentLink){ var notification = new AndroidNotification(); notification.Title = title; notification.Text = message; notification.SmallIcon = "icon_0"; notification.LargeIcon = "icon_1"; //intentdata notification.IntentData = intentLink; notification.FireTime = DateTime.Now.AddSeconds(seconds); //固有の識別子を割り当てる var identifier = AndroidNotificationCenter.SendNotification(notification, m_channelId); if(AndroidNotificationCenter.CheckScheduledNotificationStatus(identifier) == NotificationStatus.Scheduled) { AndroidNotificationCenter.UpdateScheduledNotification(identifier, notification, m_channelId); }else if(AndroidNotificationCenter.CheckScheduledNotificationStatus(identifier) == NotificationStatus.Delivered) { AndroidNotificationCenter.CancelNotification(identifier); }else if(AndroidNotificationCenter.CheckScheduledNotificationStatus(identifier)== NotificationStatus.Unknown) { AndroidNotificationCenter.SendNotification(notification, m_channelId); } } #endif

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakura_hana

2019/07/31 08:45

・PlayerPrefでFlagを付けたらどうだとか、 ・もう1つSceneを作成したらどうだとか ・IntentDataをGetして使った後にnullにしたらどうだとか これを試せばいいと思います。(3つ目は出来るかは別として)どれでも上手くいきそうな気がしますが。
navesanta

2019/07/31 09:03

>どれでも上手くいきそうな気がしますが。 →実際に3つとも試したのですがうまくいきません。 IntentDataをGetして使った後にnullにしたらどうだとか →試しましたが何も変わりませんでした。 もう1つSceneを作成したらどうだとか →Main上にnotificationがあるのでこれを他のSceneにすればいいかと思ったのですが  Mainにインスタンス上でないと実際OnApplicationが発生した時に反応しませんので  できませんでした。 PlayerPrefでFlagを付けたらどうだとか、 →notifiFlag(int)を作ってデフォルトは0。  GetLastNotificationIntentの処理の後に1にして保存。  もし1ならMain開けばいいと思うのですが  その前にGetLastNotificationIntent経由が発生すると  違うSceneを指定してあってもMainに行ってしまいます。  多分コードの手順だと思うのですが・・・。
sakura_hana

2019/08/01 00:50 編集

ちょっと何言ってるか分からない部分がありますが(「Mainにインスタンス上でないと実際OnApplicationが発生した時に反応しません」とか)、 少なくともPlayerPrefを使う方法においては、 LocalNotification.csのStartメソッドの一番先頭でPlayerPrefの条件分岐を行い、 「フラグが1(=既に処理済み)なら以降の処理(=GetLastNotificationIntent判定)を行わない」とするだけでMainに留まると思いますが。
navesanta

2019/08/01 04:33

>フラグが1(=既に処理済み)なら以降の処理(=GetLastNotificationIntent判定)を行わない そこまでは問題ないです。 問題はフラグが1の状態で次のnotification(tap)が発生すると Intentを元に別指定Sceneへ飛ばす処理のはずがMainに行ってしまうことです。 あるタイミングでフラグ1を0に戻す処理が必要なのですが そのタイミングが分かりません。これが質問の主旨です(言葉足らずですみません)
navesanta

2019/08/01 04:34

>Mainにインスタンス上でないと実際OnApplicationが発生した時に反応しません インスタンス=notificationのインスタンスの意味です。(言葉足らずですみません)
sakura_hana

2019/08/01 04:53

>Intentを元に別指定Sceneへ飛ばす処理のはずがMainに行ってしまう 「フラグが1(=既に処理済み)なら以降の処理(=GetLastNotificationIntent判定)を行わない」 だとすると、フラグが1の状態では「Intentを元に別指定Sceneへ飛ばす処理」などそもそも発生しないはずです。(行き先がMainだろうが別Sceneだろうが) これが発生しているということは、「フラグが1なら以降の処理を行わない」となっていない、ということです。ご自分でデバッグするかソースコードを質問に追記してください。 >あるタイミングでフラグ1を0に戻す処理が必要なのですがそのタイミングが分かりません。 そこはあなたが仕様として決める部分ですよね? 無理矢理推測するなら、「再度GetLastNotificationIntentを受け取りたい時」だと思うので、 LocalNotificationを設置するタイミング=OnApplicationPause あたりでしょうか?
navesanta

2019/08/01 06:16

>LocalNotificationを設置するタイミング=OnApplicationPause あたりでしょうか? 話を聞いているうちに分かってきました。 OnApplicationPause で設定して解決できました。 ありがとうございました。
guest

回答1

0

自己解決

OnApplicationPause でFlagを0に戻すように設定して解決できました。

投稿2019/08/01 06:17

navesanta

総合スコア198

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問