1. はじめに
Android6.0以降で追加された「4Kディスプレイモード」をUnityで使用する方法について説明します。
この記事の内容はSONYのXPERIAの4Kディスプレイ対応機種が対象で、XPERIA Z5 PremiumとXPERIA XZ Premiumの両方で動作確認済みです。やっている事は簡単で、Android StudioでUnityプラグイン(jarファイル)を作成して4Kディスプレイモードに切り替えるjava classを実装し、Unityからそのjava classを叩いているだけです。Unityプラグインの作成方法は以下の記事を参考にしました。
ビルド済のjarファイルをGithubに置いておきましたので、とりあえずUnityだけで試したい場合はcsファイルとjarファイルだけ手元のUnityプロジェクトにコピーして使ってください。
おまけとしてGoogle VR SDK for Unityを使った4K VR表示のサンプルコードを追加しました。4Kディスプレイモードとレンダリング解像度の変更(後述)を組み合わせる事で高解像度なVR映像を出力する事ができます。上記のXPERIAを持っていてVRに興味がある人はよかったら試してみてください。
ただし、VRで使用する場合の制限事項としてUnityは5.4系のバージョンを使用する必要があります(後述)。Google VR SDK for Unityもv1.50.0からUnity 5.6以降が必要になるのでv1.0.3~v1.40.0のバージョンを使用してください。
2. 使用方法
以下のGithubのリンクからDownload ZIPしてください。
https://github.com/m-tukiok/UnityPluginDisplay4k
使い方は簡単です。
- ZIPファイルを解凍する
- 以下の2ファイルをUnityのAssetsフォルダにコピーする
- Sceneに空のGameObjectを追加してInspectorにTest4k.csをDrag & Dropする
Unity/Assets/Plugins/Android/display4k.jar
Unity/Assets/Test4k.cs
後はBuild SettingsでAndroidを選択して普通にビルドするだけです。初めてビルドする時はPlayer SettingsでCompany Name、Product Name、Package Nameの設定を入力する必要があります。Player SettingsのMinimum API Levelの設定は「Android 4.4 'Kit Kat' (API level 19)」以降を選択すれば何でもOKみたいです。動作確認した端末のOSバージョンはAndroid 6.0 or 7.0でしたが特に問題なく実行できました。
ビルドしたapkファイルを端末にインストールして実行した後、logcatに以下のログが出ていればひとまず成功です。
I/UnityPluginTest4k(30287): Successful!
Sceneが画面に表示された状態でadb shell dumpsys SurfaceFlingerコマンドを実行して出力結果を確認するとディスプレイが4Kの設定に切り替わっている事が分かります。
Hardware Composer state (version 01050000):
mDebugForceFakeVSync=0
Display[0] configurations (* current):
0: 1080x1920, xdpi=403.411774, ydpi=403.041321, secure=1, refresh=16666667, colorTransform=0
* 1: 2160x3840, xdpi=403.411774, ydpi=403.041321, secure=1, refresh=16666667, colorTransform=0
3. 使用方法(VR編)
4KディスプレイモードとGoogle VR SDK for Unityを組み合わせる事で高解像度なVR映像を出力する事ができます。そのままでは1080 x 1920 pixelの解像度で描画されてしまうので以下の手順でレンダリング解像度(gv.StereoScreenScale)を変更します。
- GvrViewerTest4k.csをUnityのAssetsフォルダにコピーする
- GoogleVR/Prefabs/GvrViewerMainをSceneにDrag & Dropする
- GvrViewerMainのInspectorにGvrViewerTest4k.csをDrag & Dropする
Google VR SDK for Unityはあらかじめ手元のUnityプロジェクトにインポートして置いてください。ここが大事なのですが「Player SettingsのVirtual Reality Supportedは無効のまま」にしてください。
デフォルト状態(gv.StereoScreenScale=1.0)ではレンダリング解像度が1080 x 1920 pixelに設定されているようです。gv.StereoScreenScale=4.0まで上げるとかなり高画質になりますが、GPU負荷がその分上がってフレーム落ちが発生するので、描画するオブジェクトが多い場合はgv.StereoScreenScale=2.0が実用的な値なのではないかと思います。
参考としてデフォルト状態のスクリーンショットと4Kディスプレイモード + gv.StereoScreenScale=4.0に上げた状態のスクリーンショットの比較を載せておきます(XPERIA Z5Pで撮影)。
■4Kディスプレイモード + gv.StereoScreenScale=4.0
4. 既知の問題(VRのみ)
4Kディスプレイモードに変更した時にUnityでScreen.width / Screen.heightの値を取得するとなぜか2160 x 3840 pixelではなく1080 x 1920 pixelの値が返ってきます。そのせいか、4Kディスプレイモード + Google VR SDK for Unityを組み合わせた時にデフォルト設定のままで実行するとVRの画面が1/4に縮小されてこんな感じに表示されてしまいます。ちなみにこの問題はGoogle VR SDK for Unityがv1.0.3の時には発生していませんでした。
Unity 5.4系は回避策があって、Virtual Reality Supportedを無効にしたままの状態でGvrViewerMainのInspectorでDistortion Correctionの設定を「Native」から「Unity」に変更する事でこの問題を解決する事ができます。
Unity 5.5以降のバージョンはPlayer SettingsのVirtual Reality Supportedを無効にした状態でGoogle VR SDK for Unityを使用する事ができないため残念ながら今のところ解決策がありません。Unityが新しいバージョンでこの問題を修正してくれる事を祈ります。
5. 最後に
この記事の内容を用いる事でいかなるトラブル、損失、損害などの被害が発生したとしても一切の責任を負いかねますので、あくまで自己責任で使用していただく事を予めご了承ください。