Unityでステータスバーとナビゲーションバーを表示する

# 環境
- Unity 2019.4.1f1
- AQUOS sense3

UIのPanelとTextを張り付けただけのシーン。Textは-90度回転させており、「a～z」と「0～1」までの文字を並べてビューの上から下まで表示。コンテンツがどのような影響を受けるか確認した。（ナビゲーションバーの調査から、位置を左に変更しているが気にしないでください）

# ステータスバーを表示する
 [参考記事：UnityでAndroidのステータスバーを表示するコードのAndorid10対応版](https://qiita.com/tanakashu/items/cef98e8e5149eb7d7f77)

- コンテンツに重なるようにステータスバーが表示される
- ステータスバーは透明
- ナビゲーションバーは表示されておらず、下からスワイプすると表示される（この画像で表示されているのは、スクリーンショットを撮ったときに自動表示されたため）

<img width="200" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630678/ac2f3818-abea-e16c-debd-cd68ffa45d50.png">

# ナビゲーションバーを表示する
実行開始時に次のようなスクリプトを実行する。上記のステータスバー表示も同時にスクリプトに組み込んでいる。

```C#
void Start()
{
    // ナビゲーションバー表示
    Screen.fullScreen = false;
    // ステータスバー表示
    StatusBarController.Show();
}
```

- この方法だと、ステータスバーが半透明にならない
- 上部のコンテンツが見切れている（ステータスバーの高さ分、コンテンツが上にずれた感じ？）

<img width="200" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630678/815c44cc-3317-eed1-8dd6-3e5fa4c5e497.png">

- ステータスバーを表示するロジックを外すとステータスバーが表示されなくなる

# ナビゲーションバーを表示させたまま、ステータスバーを半透明
[参考記事：【Unity】Unity 5.3以降でAndroidのStatus Barを表示する方法](http://tsubakit1.hateblo.jp/entry/2016/01/23/041430)
ステータスバー表示のロジック（最初の記事にあったもの）を次のように変更

```C#
    public static int FLAG_FORCE_NOT_FULLSCREEN = 2048;
    public static int FLAG_LAYOUT_IN_SCREEN = 256;
    private static int WINDOW_FLAG_TRANSLUCENT_STATUS = 0x04000000;

    public static void Show()
    {
#if !UNITY_EDITOR && UNITY_ANDROID
        //ChangeFlags(FLAG_FULLSCREEN,FLAG_FORCE_NOT_FULLSCREEN);
        ChangeFlags(FLAG_FULLSCREEN,FLAG_FORCE_NOT_FULLSCREEN | FLAG_LAYOUT_IN_SCREEN | WINDOW_FLAG_TRANSLUCENT_STATUS);
#endif
    }
```

<img width="200" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630678/ad847afc-a34e-2d3d-31bc-41da4fac3143.png">

# ナビゲーションバーを表示させたまま、ステータスバーを透明にする

- [参考:setStatusBarColor](https://developer.android.com/reference/android/view/Window#setStatusBarColor(int))
- 上記の半透明のやり方（WINDOW_FLAG_TRANSLUCENT_STATUS）ではなく、setStatusBarColor関数を利用すると、透明や色をつけられる
- WINDOW_FLAG_TRANSLUCENT_STATUSと一緒に使えないので、ステータスバーの処理は元に戻す

```C#
   public static void Show()
    {
#if !UNITY_EDITOR && UNITY_ANDROID
        ChangeFlags(FLAG_FULLSCREEN,FLAG_FORCE_NOT_FULLSCREEN);
#endif
    }
```

- setStatusBarColorを利用する
- COLOR値は、透明度(00～FF）、赤（00～FF）、緑（00～FF）、青（00～FF）だと思われる
- 以下は完全透明

```C#
    private const uint DEFAULT_BACKGROUND_COLOR = 0x00000000;

    private static void RunOnUiThread()
    {
        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("clearFlags", clearStatusBarFlag);
                    window.Call("addFlags", addStatusBarFlag);
                    window.Call("setStatusBarColor", unchecked((int)_statusBarColor));
                }
            }
        }
    }
```
<img width="200" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630678/18b8cb31-d38d-d8e2-50ee-a06b18082d38.png">

- ちなみに0xFF000000にしたところ、黒でステータスバーが表示された

# ノッチ付きAndroid端末

ノッチのついたAndroid端末では、 Player Settings の Resolution and Presentation にある「Render outside safe area」という項目にチェックをつける必要がある