Unity as a Libraryでカットアウトの対応をしようとしたら Screen.safeArea
で取れる値が全然だめそうだったので少し調査したメモ。
環境
- 端末: GooglePixel3(実機)で開発者オプションでダブルノッチを設定
- Unity: 2019.4.14f1
Activity側でdisplayCutoutのboundingRects値を取得
// MainUnityActivity.kt
// onCreateとかで適当に
ViewCompat.setOnApplyWindowInsetsListener(mUnityPlayer) { view, windowInsetsCompat ->
windowInsetsCompat.displayCutout?.boundingRects?.let {
Log.d(TAG, "cutout1: ${it.get(0).flattenToString()}")
Log.d(TAG, "cutout2: ${it.get(1).flattenToString()}")
}
windowInsetsCompat
}
上記を実行したlog
cutout1: 0 342 88 738
cutout2: 2072 342 2160 738
Unity側でScreen.safeAreaを取得
// Hoge.cs
void Update()
{
var area = Screen.safeArea;
var resolition = Screen.currentResolution;
text.text =
$"safeArea yMin={area.yMin}, yMax={area.yMax}, xMin={area.xMin}, xMax={area.xMax}\n currentResolution width={resolition.width}, height={resolition.height}\n";
}
上記を実行したlog
safeArea yMin=0, yMax=1080, xMin=0, xMax=2160
currentResolution width=2160, height=1080
※ちなみに Screen.cutouts
も確認したが値がなかった
結論
Bridge経由でcutoutの値をUnity側に渡してあげて Screen.currentResolution
の値を元に描画可能な領域を計算してあげればよさそう。