[Unity] Androidでステータスバーを表示
Androidのステータスバー(上に出るやつ)をとりあえず表示する方法です。
Unity5中期頃からできなくなって以来、たまーに何か手軽な方法が無いか調べたりしていたのですが、この度そこそこ手軽にできたので記事としてここに書置きします。
検証環境
- Unity 5.6.5f1 (2017.4.2.f2でも動作確認)
- Android実機(InFocus M512)
サンプル AndroidFullScreenSelect.cs
using System; // ※Actionを使う為に追加 using UnityEngine; public static class AndroidFullScreenSelect { // 定数設定 private const int FLAG_FULLSCREEN = 1024; private const int FLAG_FORCE_NOT_FULLSCREEN = 2048; private static int flagValue; public static void ModeSelect(bool state) { // フルスクリーンモードの切り替え #if UNITY_ANDROID && !UNITY_EDITOR if (state) { // フルスクリーン設定 Screen.fullScreen = true; flagValue = FLAG_FULLSCREEN; } else { // 非フルスクリーン設定 Screen.fullScreen = false; flagValue = FLAG_FORCE_NOT_FULLSCREEN; } // Activityにフラグをセットする処理 RunOnAndroidUiThread( SetFlagsInThread ); #endif } #if UNITY_ANDROID && !UNITY_EDITOR private static void RunOnAndroidUiThread(Action thread) { // スレッドをセット using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { using (var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) { activity.Call("runOnUiThread", new AndroidJavaRunnable(thread)); } } } private static void SetFlagsInThread() { // Windowにフラグをセット using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { using (var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) { using (var window = activity.Call<AndroidJavaObject>("getWindow")) { window.Call("setFlags", flagValue, -1); } } } } #endif }
上記の内容のスクリプトをAssets内に追加した上で、どこかのスクリプト内で
- AndroidFullScreenSelect.ModeSelect(false); … ステータスバー表示
- AndroidFullScreenSelect.ModeSelect(true); … ステータスバー非表示
で切り替わると思います。
ActivityレベルでFLAG_FORCE_NOT_FULLSCREENを設定する事がこれで出来るようです。
ちなみに挙動的に気を付けた方がよさそうな部分があって、
Screen.fullScreen = false(true);
此方でナビゲーションバー(ソフトウェアホームボタンほか)の方の表示切り替えが出来るのですが、同時にこれを設定するかしないかで、ウィンドウサイズに違いが出るようです。
「false」だと表示した時に各バー分のサイズが削れて、「true」だとステータスバーがオーバーラップ扱いになります。
大抵ステータスバーとナビゲーションバーはセットになると思うので良いとは思うのですが、ステータスバーだけ制御する場合、上部に乗っかる分の余裕を持ってUIを作る、なんて事態になります。
スクリーンサイズはUnity内で別途管理してるのかもしれません。
尚、此方のコード(他、内記述のURL)や記事を参考にしました。
ありがうございます。
■GitHub zeh/unity-tidbits ApplicationChrome.cs
https://github.com/zeh/unity-tidbits/blob/master/application/ApplicationChrome.cs
■Qiita「Unity上からAndroidのステータスバーをいじる メモ」
https://qiita.com/satotin/items/3a819307e08935b8a09c
■Android Developers Reference
https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_FORCE_NOT_FULLSCREEN
Unityでなぜステータスバーが封印されたのか分からない点などもあり無保証でお願いいたします。
使う際は一度検証した方が良いと思います。
あと、Java関連の操作だと思うのでNDKでは動かないかもしれません。
出来ればプラグイン作ってネイティブレベルで制御するのが一番よさそうな気はします。
コメントは承認待ちです。