【Unity】アプリのバックグラウンド移動と終了の検知

f:id:nuakam:20180924103511j:plain:w500

アプリがバックグラウンドに移動したら検知したいときが稀によくある.

終了検知処理

  • API通信待機中にホームに移動したら,待機を中断して一気に全部送りたい.
  • ゲーム中断したら,再開時に一時停止メニューを表示したい.
  • オンラインゲーム中にアプリ終了したらペナルティを課したい.


( ´ー`)....個人制作アプリだとあんまり使わなさそう....

環境

  • windows10
  • Unity 2017.1.1.p3
  • Android , iOS

検知のメソッド

解決するに便利なメソッドがなんと3つもある(๑•̀ㅂ•́)و✧

  1. OnApplicationFocus
  2. OnApplicationPause
  3. OnApplicationQuit

そしてiOSとAndroidでちょっと挙動が違う(๑•̀ㅂ•́)و✧

Android

何はともあれ以下の図を参照.


f:id:nuakam:20180816152316p:plain:w500


泥端末のステータスバーは3つのボタンがあり左からバックボタン ホームボタン オーバービューボタンと並んでいる.
各機能については周知のものなので省略.

注意としてはバックボタンはアプリ側で設計しなければ機能しない.その他2つのボタンはOS側で設計されている.

iOS

iOS端末は下にボタン1こだけ.

1プッシュでホーム切り替え,ダブルプッシュでオーバービュー.バックボタンはない!(不便!)


両OSとも電源ボタンでスクリーンロックになる.

本題

関数の説明

MonoBehaviour.OnApplicationFocus(bool)

ゲームオブジェクトにフォーカスがあるときは true、そうでなければ false。

バックグラウンドから復帰時の判定.
これは明らかにiOS,Android共通.

MonoBehaviour.OnApplicationPause(bool)

アプリケーションが起動していれば true、そうでなければ false。

false:)Home,OvewView,ScreenLock時にコール
true :)上記からの復帰時にコール


ちょっとしたサンプルがないとわかりにくいよね

    private void OnApplicationPause(bool pauseStatus)
    {
        if (pauseStatus)
        {
            DebugLog("<color=red>バックグラウンド行った</color>");
        }
        else
        {
            Debug.Log("<color=red>復帰した</color>");
        }
    }

これをクラスのどこかに書くだけでいい(๑•̀ㅂ•́)و✧


Start()やUpdate()と同じ認識でいるけど合ってるかな?
どこかの関連付けたオブジェクトがアクティブ時のときのみ、動作すると予想してる.(試してない)

MonoBehaviour.OnApplicationQuit()

アプリケーションが終了する前にすべてのゲームオブジェクトで呼び出し

アプリ終了直前に呼び出される.

OnDisable()との違いが謎_(:3」∠)_
誰か教えて下さい(´・ω・`)


まとめ

把握しにくいのでまとめてみた.
検証と文献不足のため,ところどころ抜けがあったりする.


f:id:nuakam:20180718150225p:plain:w800

参考

qiita.com