読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】Unity 5.3以降でAndroidのStatus Barを表示する方法

Android Unity ネイティブ連携 トラブルシューティング

f:id:tsubaki_t1:20160123024533p:plain

Unity 5.3で個人的に気になった機能まとめ 」に書いた通り、Unity 5.3にて何故かAndroidでStatus Barを表示するオプション…例えばstatus bar hiddenが一切使用出来なくなり、ステータスバーを表示する事が出来なくなりました。

ステータスバーを表示するのが最近の主流ではなくなってきたとは言え*1、結構な数のアプリがステータスバー表示を行っているので、一応これの出し方について書いてです。

Androidでステータスバーを表示する方法

Androidでステータスバーを表示するために、Androidのネイティブな機能を直接操作します。これが「使用しても良い方法」なのかは正直微妙な所ですが、一応動くのでまぁ、自己責任で*2

このネイティブへアクセスするコードを頑張って書いても良いのですが、既に機能を纏めて公開してくれているコードがあるので、それを拝借します。

github.com

ApplicationChrome.csを導入して、アプリの任意のタイミングで下のようなコードを呼ぶと、そのタイミングからステータスバーが表示されます

ApplicationChrome.statusBarState = ApplicationChrome.States.Visible;

また単純に「表示・非表示」だけではなく、色や不透明・半透明の指定も可能みたいです。半透明の場合、画面サイズが少し上に伸びるので、その辺り注意です。

f:id:tsubaki_t1:20160123033613p:plain

ついでにApplicationChrome.csはナビゲーションバー(画面下に表示される仮想ボタン)の表示・非表示・透明表示な制御も出来るので、ナビゲーションバーが必要なアプリケーションでも意外と重宝するかもしれません。

f:id:tsubaki_t1:20160123033746p:plain

アプリ起動時にステータスバーを表示する

次にアプリケーション起動時にステータスバーを指定するアプローチについて考えてみます。
単純に考えると、最初に起動した際のシーンにて読み込むアプローチが考えられますが、このアプローチだと最初のシーンが表示された後にステータスバーが表示されます。

RuntimeInitializeOnLoadMethodなる起動時にメソッドを読むAttribute(属性)もありますが、これも同様に最初のシーンが読まれた後にステータスバーが表示されます。

もう少し前の段階で読むアプローチとしては、ScriptableObjectとして作成しておき、PreloadObjectに登録、OnEnableでステータスバーを表示するアプローチです。

【Unity】ゲーム起動直後に1度だけ処理を行う の応用ですが、少しだけ前にステータスバーが表示されます。

f:id:tsubaki_t1:20160123035234p:plain

ここまでするならActivity書き換えちゃうのが良いきもします。
もしくは、無理にステータスバーを表示するよりも、演出で少し間を持たせる方が、プレイヤーにとっては健全なような気がしますが、どうなんでしょう。

AndroidiOSの整合性

このまま単純な実装ですとiOSAndroidのステータスバーを双方設定しなければいけないので、若干クールではありません。なので、Androidでステータスバーの表示・非表示を設定したらiOSも反映させるようにしてみます。*3

f:id:tsubaki_t1:20160123041928g:plain

実際は異なるブランチで開発している、もしくはプラットフォーム切替時に何らかの処理を走らせると思うので、余りここに意味は無いと思いますが一応。

ScriptableObjectでパラメータを設定している場合、ScriptableObjectのパラメータ変更時にPlayerSettingsも変更してしまいます。

OnValidate ()はScriptableObjectでも動作するので、こういったときに便利です。後はUnityEditor.PlayerSettings.statusBarHiddenUnityEditor.PlayerSettings.iOS.statusBarStyleOnValidate ()時にScriptableObjectの値と一致するような形に変えてしまえば、iOSAndroid間で整合性は取れそうです。

ソースコード

設定が面倒くさいので、プロジェクトごと公開します。

github.com

関連

ApplicationChrome.csの提供元

Unity tidbits: changing the visibility of Android’s navigation and status bars, and implementing immersive mode

zehfernando.com

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

forum.unity3d.com

*1:確認したら最近のゲームは意外とステータスバー表示してない

*2:Unity公式でサポートしなくなった以上、悪い方法に当たるとは思います

*3:理想ではPlayerSettingsの値を取れれば良いのですが、PlayerSettingsはUnityEditor以下のコードなので…