【Unity】Unity 5.3以降でAndroidのStatus Barを表示する方法
「Unity 5.3で個人的に気になった機能まとめ 」に書いた通り、Unity 5.3にて何故かAndroidでStatus Barを表示するオプション…例えばstatus bar hiddenが一切使用出来なくなり、ステータスバーを表示する事が出来なくなりました。
ステータスバーを表示するのが最近の主流ではなくなってきたとは言え*1、結構な数のアプリがステータスバー表示を行っているので、一応これの出し方について書いてです。
Androidでステータスバーを表示する方法
Androidでステータスバーを表示するために、Androidのネイティブな機能を直接操作します。これが「使用しても良い方法」なのかは正直微妙な所ですが、一応動くのでまぁ、自己責任で。*2
このネイティブへアクセスするコードを頑張って書いても良いのですが、既に機能を纏めて公開してくれているコードがあるので、それを拝借します。
ApplicationChrome.csを導入して、アプリの任意のタイミングで下のようなコードを呼ぶと、そのタイミングからステータスバーが表示されます。
ApplicationChrome.statusBarState = ApplicationChrome.States.Visible;
また単純に「表示・非表示」だけではなく、色や不透明・半透明の指定も可能みたいです。半透明の場合、画面サイズが少し上に伸びるので、その辺り注意です。
ついでにApplicationChrome.csはナビゲーションバー(画面下に表示される仮想ボタン)の表示・非表示・透明表示な制御も出来るので、ナビゲーションバーが必要なアプリケーションでも意外と重宝するかもしれません。
アプリ起動時にステータスバーを表示する
次にアプリケーション起動時にステータスバーを指定するアプローチについて考えてみます。
単純に考えると、最初に起動した際のシーンにて読み込むアプローチが考えられますが、このアプローチだと最初のシーンが表示された後にステータスバーが表示されます。
RuntimeInitializeOnLoadMethodなる起動時にメソッドを読むAttribute(属性)もありますが、これも同様に最初のシーンが読まれた後にステータスバーが表示されます。
もう少し前の段階で読むアプローチとしては、ScriptableObjectとして作成しておき、PreloadObjectに登録、OnEnableでステータスバーを表示するアプローチです。
【Unity】ゲーム起動直後に1度だけ処理を行う の応用ですが、少しだけ前にステータスバーが表示されます。
ここまでするならActivity書き換えちゃうのが良いきもします。
もしくは、無理にステータスバーを表示するよりも、演出で少し間を持たせる方が、プレイヤーにとっては健全なような気がしますが、どうなんでしょう。
AndroidとiOSの整合性
このまま単純な実装ですとiOSとAndroidのステータスバーを双方設定しなければいけないので、若干クールではありません。なので、Androidでステータスバーの表示・非表示を設定したらiOSも反映させるようにしてみます。*3
実際は異なるブランチで開発している、もしくはプラットフォーム切替時に何らかの処理を走らせると思うので、余りここに意味は無いと思いますが一応。
ScriptableObjectでパラメータを設定している場合、ScriptableObjectのパラメータ変更時にPlayerSettingsも変更してしまいます。
OnValidate ()はScriptableObjectでも動作するので、こういったときに便利です。後はUnityEditor.PlayerSettings.statusBarHiddenやUnityEditor.PlayerSettings.iOS.statusBarStyleをOnValidate ()時にScriptableObjectの値と一致するような形に変えてしまえば、iOSとAndroid間で整合性は取れそうです。
ソースコード
設定が面倒くさいので、プロジェクトごと公開します。
関連
ApplicationChrome.csの提供元
Unity tidbits: changing the visibility of Android’s navigation and status bars, and implementing immersive mode